TCP服务器正在关闭连接

时间:2011-04-26 16:18:40

标签: python

我有这段代码

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()

我可以连接到主机,服务器可以发送数据,但是当客户端向服务器发送内容时,连接会自动关闭。为什么?谢谢。

4 个答案:

答案 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连接如下:

  1. 打开连接
  2. 发送数据
  3. 关闭连接
  4. 如果您只是想发送数据包,请尝试使用UDP,这样每个数据包都会在到达时读取,只要您正在收听它。

    值得告诉我们您计划将此服务器用于...

    无论如何希望有所帮助。