TCP和UDP套接字创建和使用的主要区别
- 连接特性
- TCP:面向连接的协议,在通信开始前需要通过三次握手建立可靠连接,通信结束后需要四次挥手断开连接。这确保了数据的有序性和可靠性。
- UDP:无连接协议,发送数据前不需要建立连接,直接将数据报发送出去,不保证数据的有序性和可靠性,但传输速度快,适合对实时性要求高但对数据准确性要求相对较低的场景,如视频流、音频流传输。
- 数据传输可靠性
- TCP:通过校验和、重传机制等保证数据传输的可靠性,若数据丢失或出错,会自动重传。
- UDP:不提供可靠性保障,数据可能会丢失、重复或乱序到达。
- 数据边界
- TCP:是字节流协议,没有数据边界,数据在传输过程中可能会被分割或合并。应用层需要自己处理数据边界问题。
- UDP:是数据报协议,有明确的数据边界,每个UDP数据报都是独立的,接收方每次接收的是完整的数据报。
- 传输效率
- TCP:由于要保证可靠性,有连接建立、重传等开销,传输效率相对较低。
- UDP:无连接建立和重传等开销,传输效率高。
TCP服务器端接收数据示例代码
import socket
# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_socket.bind(('127.0.0.1', 12345))
# 监听连接
server_socket.listen(1)
print('等待客户端连接...')
# 接受客户端连接
conn, addr = server_socket.accept()
print(f'与 {addr} 建立连接')
# 接收数据
data = conn.recv(1024)
print(f'接收到数据: {data.decode()}')
# 关闭连接
conn.close()
server_socket.close()
UDP服务器端接收数据示例代码
import socket
# 创建UDP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_socket.bind(('127.0.0.1', 12345))
print('等待接收数据...')
# 接收数据
data, addr = server_socket.recvfrom(1024)
print(f'从 {addr} 接收到数据: {data.decode()}')
# 关闭套接字
server_socket.close()