Socket
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。 Socket利用三元组(IP地址,协议,端口)可以唯一标识进程,在不同的计算机中通信。
socket官方文档https://docs.python.org/3/library/socket.html
Socket()函数
用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
fimaly:套接字家族,常用AF_INET type:两端点的通信类型,SOCK_STREAM流式套接字,用于面向连接的协议(TCP);SOCK_DGRAM数据报套接字,用于面向无连接的协议(UDP);SOCK_RAW原始套接字,常用在ICMP。 protocol:用于标识域和类型中的协议的变体,通常缺省,默认为0。 只有相同类型的套接字才能通信。
Socket内建方法
服务器: s.bind((host,port)):绑定地址(host,port)到套接字。 s.listen(backlog):设置并启动TCP侦听器。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,常设为 5 。 s.accept(): 被动接受TCP客户端连接,(阻塞式)等待连接的到来。
客户端: s.connect(address):主动初始化TCP服务器连接。 s.connect_ex(address):connect()函数的扩展版本,出错时返回出错码,而不是抛出异常。
公共用途: s.recv(bufsize[,flags]):接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。 s.send(bytes[,flags]):发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。 s.recvfrom(bytes[,flags]):接收 UDP 数据,但返回值是(bytes,address)。 s.sendto(bytes[,flags],address):发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。 s.settimeout(timeout):设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())。
菜鸟教程:https://www.runoob.com/Python/python-socket.html
Socket通信流程
参考博客;https://www.cnblogs.com/liqb/p/9371748.html
例子
1.回声服务器 echo-server.py:
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
echo-client.py:
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
官方文档:https://realpython.com/python-sockets/#echo-client-and-server 分析参考:https://zhuanlan.zhihu.com/p/44722743
|