1. 简介
1.1 TCP (Transmission Control Protocol)
- 面向连接
- 面向字节流
- 一对一通信
- 可靠传输,使用流量控制和拥塞控制
- 首部最小20字节,最大60字节
1.2 UDP (User Datagram Protocol)
- 无连接
- 对应用层交付的报文直接打包
- 支持一对一,一对多,多对一和多对多通信
- 传输不可靠
- 首部开销小,仅8字节
以下来自于湖科大教书匠《计算机网络简明教程及仿真实验》视频截图:
2. Python
2.1 TCP
- 服务端 Server
import socket
# 创建 socket
# AF_INET 表示 IPV4 协议,AF_INET6 表示 IPV6
# SOCK_STREAM 表示面向字节流的 TCP 协议,SOCK_DGRAM 表示 UDP
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定 IP 和 port
tcp_server.bind("127.0.0.1", 8888)
# 监听端口
# 参数:等待连接的最大数量
tcp_server.listen(5)
print('waiting for connection ...')
while True:
# 接受新的连接
sock, addr = tcp_server.accept()
# 创建新的线程处理 TCP 连接
# 每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接
t = threading.Thread(target=tcp, args=(sock, addr))
def tcp(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
- 客户端 Client
import socket
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接,注意 (IP, port) 是一个元组 tuple
tcp_client.connect(('127.0.0.1', 8888))
# 发送数据
tcp_client.send('hello')
# 接收数据
buffer = []
while True:
data = tcp_client.recv(1024) # 指定单次接收的最大字节数
if data:
buffer.append(data)
else:
break
data_bytes = b''.join(buffer)
tcp_client.close()
2.2 UDP
- 服务器 Server
import socket
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
udp_server.bind(('127.0.0.1', 9999))
while True:
# 接收数据
data, addr = udp_server.recvfrom(1024)
print('Received from %s:%s.' % addr)
udp_server.sendto(b'Hello, %s!' % data, addr)
- 客户端 Client
import socket
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
udp_client.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(udp_client.recv(1024).decode('utf-8'))
udp_client.close()
参考:
网络编程www.liaoxuefeng.com