Python网络编程基础:Socket与SocketServer模块应用
Python标准库提供了socket和socketserver模块。socket模块实现了BSD Socket API的底层接口,而socketserver模块通过高级抽象简化了服务器开发。
Socket模块核心功能 Python网络编程主要支持TCP和UDP协议:
- TCP:面向连接的可靠传输协议,建立双向数据流
- UDP:无连接的报文协议,不保证数据可靠性
常用类方法
| 方法 | 功能 |
|---|---|
| socket.socket() | 创建新套接字对象 |
| socket.gethostbyname() | 解析主机名为IP地址 |
| socket.getservbyname() | 获取服务对应端口号 |
套接字对象方法
| 方法 | 用途 |
|---|---|
| sock.bind() | 绑定地址和端口 |
| sock.listen() | 启用连接监听 |
| sock.accept() | 接收客户端连接 |
| sock.recv() | 接收数据 |
| sock.send() | 发送数据 |
基础网络程序实现 UDP通信示例 服务端实现:
import socket
SERVER_PORT = 6000
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(('', SERVER_PORT))
while True:
message, client_addr = udp_socket.recvfrom(1024)
print(f"收到来自{client_addr}的消息: {message.decode()}")
客户端实现:
import socket
TARGET_PORT = 6000
HOST = '127.0.0.1'
client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_sock.sendto(b'测试消息', (HOST, TARGET_PORT))
TCP通信示例 支持退出的服务端:
import socket
import time
LISTEN_PORT = 1122
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', LISTEN_PORT))
server.listen(5)
active = True
while active:
client_sock, addr = server.accept()
while True:
data = client_sock.recv(1024)
if not data or data.decode().upper() == 'QUIT':
active = False
break
response = f"已接收: {data.decode()}"
client_sock.send(response.encode())
client_sock.close()
server.close()
交互式客户端:
import socket
class TCPClient:
def __init__(self):
self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.conn.connect(('127.0.0.1', 1122))
self.run()
def run(self):
while True:
msg = input("输入消息> ")
self.conn.send(msg.encode())
if msg.upper() == 'QUIT': break
response = self.conn.recv(1024)
print("服务器响应:", response.decode())
SocketServer模块应用 简化服务器开发的同步TCP示例:
from socketserver import TCPServer, StreamRequestHandler
import time
class RequestHandler(StreamRequestHandler):
def handle(self):
data = self.rfile.readline().strip()
self.wfile.write(f"[{time.ctime()}] {data}".encode())
server = TCPServer(('', 12346), RequestHandler)
server.serve_forever()
多线程服务器实现:
from socketserver import ThreadingMixIn, TCPServer, StreamRequestHandler
class ThreadedServer(ThreadingMixIn, TCPServer):
pass
class Handler(StreamRequestHandler):
def handle(self):
client_data = self.rfile.readline()
response = f"处理结果: {client_data.decode().upper()}"
self.wfile.write(response.encode())
ThreadedServer(('', 8080), Handler).serve_forever()
