Python 使用Socket提供对TCP / UDP网络通信的支持。
TCP
client
TCP是带连接的可靠通信协议。创建TCP连接时,主动发起连接的称为客户端,被动响应连接称为服务器。
示例,请求博客园首页:
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('www.cnblogs.com',80))s.send(b'GET / HTTP/1.1\r\nHost: www.cnblogs.com\r\nConnection: close\r\n\r\n')# receivebuf = list()while True: d = s.recv(1024) if d: buf.append(d) else: breakprint(buf)s.close()
说明:
- socket.socket()
建立socket连接。
socket.AF_INET代表使用IPv4协议,socket.AF_INET6使用更新的IPv6协议。
SOCK_STREAM指定使用面向流的TCP协议。
- s.connect()
进行socket连接,参数为包含url和port的元组。
- s.send(str)
通过socket发送数据。
- s.recv(max)
接收返回的数据,max指定最大字节数。
server
服务端程序监听接口,拦截请求然后进行响应。
先编写一个client:
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('127.0.0.1', 8081))print(s.recv(1024).decode('utf-8'))s.send('Finley')s.close()
server代码:
import socketimport threadingdef respond(sock, addr): buf = list() while True: d = sock.recv(1024) if d: buf.append(d) else: break data = 'Hello, ' + buf sock.send(data)if __name__ == '__main__': s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 8081)) s.listen(5) while True: sock, addr = s.accept() s.send('Hello from server') t = threading.Thread(target=respond, args=(sock, addr)) t.start() s.close()
很多地方与client一致,主要多了监听端口所需的API:
- bind()
接受一个包含URL和port的元组作为参数,绑定该端口
- listen(max)
执行监听, 阻塞式调用max为最大连接数
- accept()
建立连接
UDP
UDP是无连接的用户数据报协议,通常用来发送要求速度快不要求可靠到达的数据,如检测用户是否在线。
UDP的socket为SOCK_DGRAM,udp无需连接,服务器无需绑定接口进行监听。
client:
import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)data = 'hello's.sendto(data, ('127.0.0.1', 9999))print(s.recv(1024).decode('utf-8'))s.close()
使用sendto(data, addr_tuple)发送数据报
server:
import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(('127.0.0.1', 9999))print('bind udp on 9999')data, addr = s.recvfrom(1024)print('Received from %s:%s.' % addr)s.sendto(b'Hello, %s!' % data, addr) s.close()
使用recvfrom(max)接收发送来的数据。