优化连接建立过程
- 复用地址:设置
SO_REUSEADDR
选项,允许重用本地地址,特别是在服务器重启时可以快速绑定到相同端口,避免 Address already in use
错误。
- 非阻塞模式:将套接字设置为非阻塞模式,这样在连接建立时不会阻塞主线程,提高效率。
代码示例
import socket
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
# 接收数据
self.data = self.request.recv(1024).strip()
print(f"{self.client_address[0]} wrote:")
print(self.data)
# 发送数据
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# 创建服务器
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
# 设置复用地址
server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 启动服务器
server.serve_forever()
数据发送和接收过程中的异常情况及处理
- 接收数据时的异常
- 连接断开:当客户端断开连接时,
recv
方法会返回空字节串 b''
。可以通过检查返回值来判断连接是否断开。
data = self.request.recv(1024)
if not data:
print("Connection closed by client")
- 超时:设置
socket.settimeout
来处理接收数据的超时情况。
self.request.settimeout(5) # 设置5秒超时
try:
data = self.request.recv(1024)
except socket.timeout:
print("Receive data timeout")
- 发送数据时的异常
- 连接异常:如果连接已经断开,发送数据会抛出
socket.error
异常。可以捕获该异常并进行相应处理,比如重新建立连接。
try:
self.request.sendall(data)
except socket.error as e:
print(f"Send data error: {e}")
# 重新建立连接等处理