Skip to content

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类型
)
One day we will climb the highest mountain, and suvey the smallest point.