本文基于Python的socket库,介绍TCP和UDP两种网络编程的基本原理和实现方法。
TCP编程
基本概念
- TCP是面向连接的可靠传输协议
- 通信双方分为客户端和服务器
- 需要建立连接后才能传输数据
客户端实现
import socket
# 创建TCP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect(('www.sina.com.cn', 80))
# 发送HTTP请求
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
# 接收数据
data = s.recv(1024)
# 关闭连接
s.close()
服务器实现
import socket
import threading
def handle_client(sock, addr):
while True:
data = sock.recv(1024)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
# 创建服务器socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
s.listen(5)
while True:
sock, addr = s.accept()
# 为每个客户端创建新线程
t = threading.Thread(target=handle_client, args=(sock, addr))
t.start()
UDP编程
基本概念
- UDP是无连接的不可靠传输协议
- 传输速度快,适合对可靠性要求不高的场景
- 不需要建立连接,直接发送数据包
服务器实现
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 9999))
while True:
data, addr = s.recvfrom(1024) # 接收数据和客户端地址
s.sendto(b'Hello, %s!' % data, addr) # 发送回应
客户端实现
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
s.sendto(data, ('127.0.0.1', 9999)) # 发送数据
print(s.recv(1024).decode('utf-8')) # 接收回应
s.close()
核心区别
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 可能丢失数据 |
| 速度 | 相对较慢 | 相对较快 |
| 使用场景 | 网页浏览、文件传输 | 视频流、DNS查询 |
关键要点
- TCP需要先建立连接,UDP直接发送数据
- 服务器需要绑定端口并监听连接
- TCP服务器通常需要多线程处理并发连接
- UDP使用
sendto()和recvfrom()方法 - 同一台机器上的TCP和UDP端口互不冲突