我已经重写了句柄函数。现在,每次客户端连接时,它都会保持套接字打开,以回显客户端发送的全部大写内容。服务器不应允许多个连接,因此只有一个套接字保持打开状态。这要怎么做?
服务器 -
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
while 1:
self.data = self.request.recv(1024).strip()
print self.data
# echo back data in all caps
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
客户端需要与服务器一起工作一段时间(本例中为 10 秒)。在此期间,服务器不应接受来自任何其他客户端的连接。
客户 -
import socket
import sys
import time
HOST, PORT = "localhost", 9999
data = 1
future = time.time() + 10 # work for 10 seconds
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Connect to server and send data
sock.connect((HOST, PORT))
except socket.error:
sys.exit()
else:
while time.time() < future:
sock.sendall(data + "\n")
received = sock.recv(1024)
print received
data += 1
finally:
sock.close()
您的句柄永远不会退出,并且因为您没有使用任何多线程/多处理,所以它将永远为一个连接提供服务。所以首先你应该有办法戒掉。例如来自客户端的消息“退出”。像这样:
def handle(self):
while 1:
self.data = self.request.recv(1024).strip()
print self.data
if self.data == 'quit':
break
# echo back data in all caps
self.request.sendall(self.data.upper())