TCP套接字
- 适用场景:适用于对数据准确性要求高、数据传输完整性至关重要的场景,如文件传输、电子邮件、网页浏览(HTTP协议基于TCP)、数据库连接等。
- 主要特点:
- 面向连接:在数据传输前,需要通过三次握手建立可靠的连接。
- 可靠传输:通过序列号、确认应答、重传机制等保证数据准确无误且按顺序到达。
- 有流量控制和拥塞控制:避免发送方发送数据过快导致接收方处理不过来,以及网络拥塞。
- 举例:使用Python的
socket
模块实现简单的文件传输服务器和客户端。服务器端监听指定端口,客户端连接服务器后,发送文件名和文件内容,服务器接收并保存文件。
import socket
# 服务器端
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(1)
while True:
conn, addr = server_socket.accept()
file_name = conn.recv(1024).decode('utf-8')
with open(file_name, 'wb') as f:
while True:
data = conn.recv(1024)
if not data:
break
f.write(data)
conn.close()
# 客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))
file_name = 'test.txt'
client_socket.send(file_name.encode('utf-8'))
with open(file_name, 'rb') as f:
while True:
data = f.read(1024)
if not data:
break
client_socket.send(data)
client_socket.close()
UDP套接字
- 适用场景:适用于对实时性要求高、对数据准确性要求相对较低的场景,如视频流传输、音频流传输(如VoIP)、在线游戏等。
- 主要特点:
- 无连接:无需建立连接,直接发送数据,减少了建立连接的开销和延迟。
- 不可靠传输:不保证数据一定能到达,也不保证数据的顺序。
- 传输效率高:没有复杂的确认、重传等机制,速度快。
- 举例:使用Python的
socket
模块实现简单的UDP聊天程序,两个程序分别作为发送端和接收端,相互发送和接收消息。
import socket
# 接收端
recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_socket.bind(('127.0.0.1', 9999))
while True:
data, addr = recv_socket.recvfrom(1024)
print(f"收到来自 {addr} 的消息: {data.decode('utf-8')}")
# 发送端
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
msg = input("请输入要发送的消息: ")
send_socket.sendto(msg.encode('utf-8'), ('127.0.0.1', 9999))