参考资料:[译]Python 中的 Socket 编程(指南)
What is a socket object?
A socket is an endpoint of communication—an object through which your application communicates with other Windows Sockets (Winsock) applications across a network.
下面的示意图中,我们将看到 Socket API 的调用顺序和 TCP 的数据流:
让我们一起来看看 API 调用发生了什么?
socket.socket()
创建了一个 socket 对象,并且支持 context manager type,你可以使用 with 语句,这样你就不用再手动调用 s.close() 来关闭 socket 了
调用 socket()
时传入的参数:
第1个参数:
AF_INET
:支持 IPv4 地址族
AF_INET6
:支持 IPv6 地址族
AF_INET6 sockets provide support for Internet Protocol version 6 (IPv6) 128 bit (16 byte) address structures. Programmers can write applications using the AF_INET6 address family to accept client requests from either IPv4 or IPv6 nodes, or from IPv6 nodes only.
Socket applications written with AF_INET6 address family allow Internet Protocol version 6 (IPv6) applications to work with Internet `Protocol version 4 (IPv4) applications (those applications that use AF_INET address family). This feature allows socket programmers to use an IPv4-mapped IPv6 address format. This address format represents the IPv4 address of an IPv4 node to be represented as an IPv6 address. The IPv4 address is encoded into the low-order 32 bits of the IPv6 address, and the high-order 96 bits hold the fixed prefix 0:0:0:0:0:FFFF.
第2个参数:
SOCK_STREAM
:该 socket 使用TCP协议在网络中传输消息
SOCK_DGRAM
:该 socket 使用UDP协议在网络中传输消息
conn, address = sever_socket.accept()
根据server_socket接收到的信息,可以让我们知道谁(哪个客户端)通过上述的socket连接到服务器,其中:
conn
指的是客户端(发出连接请求)的socket
address
指是的地址元组,形如(客户端的IP地址, TCP端口号)
accept()
方法阻塞并等待传入连接。当一个客户端连接时,它将返回一个新的 socket 对象,对象中有表示当前连接的 conn 和一个由主机、端口号组成的 IPv4/v6 连接的元组,更多关于元组值的内容可以查看 socket 地址族中的详情
这里必须要明白我们通过调用 accept()
方法拥有了一个新的 socket 对象——conn
。这非常重要,因为你将用conn
这个 socket在对象和客户端之间进行通信。
与通过server_socket.listen()
监听一个 socket 不同的是:
server_socket
只用来接受新的连接请求
而conn
(通过accept()
获取的客户端 socket 连接对象),会使用一个无限 while 循环来阻塞调用 conn.recv()
方法,获取客户端使用conn.sendall()
或conn.send()
传过来的任何数据。