我正在使用与Android连接的python套接字服务器并定期发送消息.我有一个问题,请求在每个发送的消息上关闭,我需要它保持打开,直到Android决定关闭它.
Curentlly它看起来像这样:
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()
Run Code Online (Sandbox Code Playgroud)
我已经通过while True在我的handle()定义中添加一个来解决这个问题,然而,这被批评为一个糟糕的解决方案,正确的方法是覆盖process_request和shutdown方法.
尝试解决方案
我while从代码中删除了代码,用netcat在本地连接到服务器,发送了一条消息,然后查看连接何时关闭.
我想看看连接关闭后的方法是什么,以确定我必须覆盖的内容.
我已经通过调试器步入serve_forever()并跟随它到这部分代码:
> /usr/lib/python2.7/threading.py(495)start()
494 try:
--> 495 _start_new_thread(self.__bootstrap, ())
496 except Exception:
Run Code Online (Sandbox Code Playgroud)
在第495行通过后(我无法进入),连接关闭.
我以某种方式怀疑通过套接字保持连接是如此喧嚣,这基本上是我们选择通过套接字进行通信,拥有连续连接而不是"每个已发送消息的一个连接"系统的原因.
关于实施或链接的想法?
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2838 次 |
| 最近记录: |