Network Programming
Internet Protocol Suite
- TCP/IP
- UDP
IP协议
按块发送
IPv4: 32位整数
IPv6: 128位整数
TCP协议
一种可靠连接,建立在IP协议之上,负责建立连接,保证数据包按顺序到达
报文包含
- 源IP地址
- 目标IP地址
- 源端口
- 目标端口
UDP协议
不可靠连接,速度快
TCP 编程
Client <=> Server
Client
python
# 创建socket
s = socket.socket(
socket.AF_INET, # IPv4协议,AF_INET6是IPv6
socket.SOCK_STREAM # 数据流
)
# 建立连接
s.connect(
('<ip_address>', 80) # IP地址和端口号
)
# 发送数据
s.send(
b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n'
)
# 接收数据
buffer = []
while True:
d = s.recv(
1024 # 每次最多接收1k字节
)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
# 关闭socket
s.close()
# 接收数据处理
header, html = data.split(b'\r\n\r\n', 1)
with open('index.html', 'wb') as f:
f.write(html)
Server
python
# 创建socket
s = socket.socket(
socket.AF_INET, # IPv4协议,AF_INET6是IPv6
socket.SOCK_STREAM # 数据流
)
# 监听端口
def tcplink(sock, 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')))
sock.close()
print('Connection from %s:%s closed' % addr)
s.bind(
('127.0.0.1', 88)
)
s.listen(5) # 等待连接的最大数量
while True:
sock, addr = s.accept()
t = threading.Thread(
target = tcplink,
args=(sock, addr)
)
t.start()
UDP 编程
Client
不需要connect,只需要sendto
python
s.sendto(
b'Hello, %s!' % data,
addr
)
Server
python
s = socket.socket(
socket.AF_INET, # IPv4协议,AF_INET6是IPv6
socket.SOCK_DGRAM # UDP类型
)