2

我正在使用与 Android 连接并定期发送消息的 python 套接字服务器。我有一个问题,请求在每条发送的消息上都关闭,我需要它保持打开状态,直到 Android 决定关闭它。

目前它看起来像这样:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
    try:
        while True:
            message = self.rfile.readline().strip()  # clip input at 1Kb            
            my_event = pygame.event.Event(USEREVENT, {'control':message})
            pygame.event.post(my_event)
    except KeyboardInterrupt:
        sys.exit(0)
    finally:
        self.request.close()

我通过while True在我的handle()定义中添加 a 解决了这个问题,但是,这被批评为一个糟糕的解决方案,正确的方法是覆盖process_requestandshutdown方法。

解决方案的尝试

while从代码中删除了,用netcat本地连接到服务器,发送了一条消息,然后去看看什么时候关闭连接。

我想看看关闭连接以找出我必须覆盖的方法是什么。

我已经通过调试器逐步完成serve_forever()并跟随它到这部分代码:

> /usr/lib/python2.7/threading.py(495)start()
    494         try:
--> 495             _start_new_thread(self.__bootstrap, ())
    496         except Exception:

通过第 495 行后(我无法进入它),连接将关闭。

我不知何故怀疑通过套接字维持连接是否如此忙碌,这基本上是我们选择通过套接字进行通信的原因,以建立连续连接而不是“每个发送消息一个连接”系统。

关于实施的想法或链接?

4

1 回答 1

7

handle为每个客户端连接调用该方法,并在返回时关闭连接。使用while循环很好。当客户端关闭连接时退出循环。

示例(Python 3 语法):

class EchoHandler(socketserver.StreamRequestHandler):

    def setup(self):
        print('{}:{} connected'.format(*self.client_address))

    def handle(self):
        while True:
            data = self.request.recv(1024)
            if not data: break
            self.request.sendall(data)

    def finish(self):
        print('{}:{} disconnected'.format(*self.client_address))
于 2013-01-20T07:51:14.980 回答