我有这段代码
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
_data = self.request.recv(1024)
Utils.log("Received from %s: %s" % (self.client_address, _data))
用
调用它kamcon_server = ThreadedTCPServer((HOST, 3011), ThreadedTCPRequestHandler)
server_thread = threading.Thread(target = kamcon_server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
我可以连接到主机,服务器可以发送数据,但是当客户端向服务器发送内容时,连接会自动关闭。为什么?谢谢。
答案 0 :(得分:11)
您的handle()
方法每个连接只调用一次recv()
。如果要处理来自客户端的多条消息,则需要循环。您还应该考虑您的协议,以便您可以处理大于1024字节的请求/响应消息(例如,解析_data
并确定您是否有完整的消息,缓冲区部分请求等)。
例如:
def handle(self):
close = 0
while not close:
_data = self.request.recv(1024)
if not _data:
# EOF, client closed, just return
return
Utils.log("Received from %s: %s" % (self.client_address, _data))
self.request.send('got %d bytes\r\n' % len(_data))
if 'quit' in _data:
close = 1
客户会话:
% telnet localhost 3011
hi
got 4 bytes
bye
got 5 bytes
telnet> quit
答案 1 :(得分:2)
尝试此代码,它允许多个连接到同一端口,而不是关闭套接字,直到客户端执行:
import SocketServer
import socket, threading
class MyTCPHandler(SocketServer.BaseRequestHandler):
BUFFER_SIZE = 4096
def handle(self):
while 1:
#get input with wait if no data
data = self.request.recv(self.BUFFER_SIZE)
#suspect many more data (try to get all - without stop if no data)
if (len(data)==self.BUFFER_SIZE):
while 1:
try: #error means no more data
data += self.request.recv(self.BUFFER_SIZE, socket.MSG_DONTWAIT)
except:
break
#no data found exit loop (posible closed socket)
if (data == ""): break
#processing input
print "%s (%s) wrote: %s" % (self.client_address[0], threading.currentThread().getName(), data.strip())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
您也可以使用ForkingTCPServer代替ThreadingTCPServer。
答案 2 :(得分:1)
一旦建立新的TCP连接就调用handle()方法,而不是每次有可用数据时调用。您应该在此方法中处理TCP会话的所有通信。
由于您所做的只是读取一块数据,因此当handle()方法返回时,连接将被关闭。
答案 3 :(得分:0)
查看TCP连接如何工作,在连接关闭的TCP数据的每个“流”结束时,告诉监听器该批次中不再有数据传入。大致TCP连接如下:
如果您只是想发送数据包,请尝试使用UDP,这样每个数据包都会在到达时读取,只要您正在收听它。
值得告诉我们您计划将此服务器用于...
无论如何希望有所帮助。