📡 网络基础概念
IP地址
- IPv4: 32位整数,如
192.168.0.1 - IPv6: 128位整数,如
2001:0db8:85a3:0042:1000:8a2e:0370:7334
TCP协议
- 建立在IP协议之上
- 通过握手建立可靠连接
- 保证数据包按顺序到达
端口
- 用于区分同一计算机上的不同网络程序
- 一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口
🔌 TCP编程
TCP服务器
import socket
HOST = '127.0.0.1' # 服务器ip地址
PORT = 8888 # 服务器端口号
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
TCP客户端
import socket
HOST = '127.0.0.1' # 服务器ip地址
PORT = 8888 # 服务器端口号
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
s.close()
print('Received', repr(data))
📨 UDP编程
UDP服务器
import socket
HOST = '127.0.0.1'
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))
while True:
data, addr = s.recvfrom(1024)
print('Received from', addr, ':', data)
s.sendto(data, addr)
UDP客户端
import socket
HOST = '127.0.0.1'
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'Hello, world', (HOST, PORT))
data, addr = s.recvfrom(1024)
s.close()
print('Received', repr(data))
🌍 HTTP服务器
from http.server import HTTPServer, BaseHTTPRequestHandler
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'<html><head><title>Test</title></head>')
self.wfile.write(b'<body><p>This is a test.</p>')
self.wfile.write(b'</body></html>')
def run(server_class=HTTPServer, handler_class=MyHandler, addr='localhost', port=8000):
server_address = (addr, port)
httpd = server_class(server_address, handler_class)
print(f'Starting httpd server on {addr}:{port}...')
httpd.serve_forever()
if __name__ == '__main__':
run()