zhouzhaoxin
zhouzhaoxin 主攻python,喜欢读书,喜欢摄影,芒格的忠实追随者。关注各个领域发展,取长补短,擅长结合多学科技术解决问题

Soket理解

Soket理解

在计算机科学中,网络套接字(英语:Network socket),又译网络套接字、网络接口、网络插槽,是电脑网络中进程间数据流的端点。使用以网际协议(Internet Protocol)为通信基础的网络套接字,称为网际套接字(Internet socket)。因为网际协议的流行,现代绝大多数的网络套接字,都是属于网际套接字。

socket是一种操作系统提供的进程间通信机制。

基本概念

在操作系统中,通常会为应用程序提供一组应用程序接口(API),称为套接字接口(英语:socket API)。应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。最早的套接字接口来自于4.2 BSD,因此现代常见的套接字接口大多源自Berkeley套接字(Berkeley sockets)标准。

在套接字接口中,以IP地址及通信端口组成套接字地址(socket address)。远程的套接字地址,以及本地的套接字地址完成连接后,再加上使用的协议(protocol),这个五元组(five-element tuple),作为套接字对(socket pairs),之后就可以彼此交换数据。

例如,再同一台计算机上,TCP协议与UDP协议可以同时使用相同的port而互不干扰。 操作系统根据套接字地址,可以决定应该将数据送达特定的进程或线程。这就像是电话系统中,以电话号码加上分机号码,来决定通话对象一般。

Python 实现

每一种语言都会对socket进行封装,从而控制进程间的通讯。web服务器就是对socket实现的封装。

客户端

当你点击链接到此页面的时候,你的浏览器做了如下动作

1
2
3
4
5
6
7
# coding:utf-8
# socket.AF_INET    用于服务器与服务器之间的网络通信
# socket.SOCK_STREAM    基于TCP的流式socket通信
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.python.org", 80))
s.send(b'1234') # 返回字符串的长度4

先建立一个服务器与服务器间通讯的socket(其协议为TCP,三次握手),然后使用socket建立到本网站的链接。链接建立之后,我们创建的名为s的socket就可以发送一个包含信息的请求,之后,客户端会建立一个相同的socket接受返回的信息,然后销毁。客户端的socket一般只用于一次交换。

服务端

1
2
3
4
5
6
7
# coding:utf-8
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
serversocket.bind((socket.gethostname(), 80))
# 监听端口,变成一个服务器
serversocket.listen(5)

使用socket.gethostname()作为url可以接受所有请求,而如果使用localhost 或者127.0.0.1我们就只能使用当前的 机器访问。

listen方法的参数可以制定此socket的最大连接数,超过最大链接则拒绝外部请求

有了一个服务端的socket之后我们就可以把他放到循环中处理请求

1
2
3
4
5
6
while True:
    (clientsocket,address) = serversocket.accept()
    # clientsocket为和client建立的链接
    # 假设我们通过一个线程处理链接
    ct = client_thread(clientsocket)
    ct.run()

服务器端的socket只做了这些,它不会发送任何数据,也不会接受任何数据,他只是产生了一个客户端的socket 每一个被创建的客户端socket都会通过connect()方法与其他的socket进行通讯

总结

理解socket的基本概念,了解在socket的程序实现。 socket有两种,服务器端和客户端,服务器端socket只是通过请求产生客户端socket,客户端socket可以通过建立的connection()进行通讯。

客户端的socket和服务器端通过客户端请求产生的socket是同等的。