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
私は定義にa を追加することでこれを解決しましたhandle()
が、これは悪い解決策であると批判され、正しい方法はprocess_request
andshutdown
メソッドをオーバーライドすることです。
解決の試み
コードからを削除し、while
netcat を使用してローカルでサーバーに接続し、メッセージを送信して、接続がいつ閉じられるかを確認しました。
何をオーバーライドする必要があるかを理解するために、接続が閉じられた後のメソッドが何であるかを確認したかったのです。
デバッガーをステップ実行し、serve_forever()
コードのこの部分までたどりました。
> /usr/lib/python2.7/threading.py(495)start()
494 try:
--> 495 _start_new_thread(self.__bootstrap, ())
496 except Exception:
495行目を通過した後(私はそれに入ることができません)、接続は閉じられます。
ソケットを介して接続を維持するのは非常に手間がかかるのではないかと疑っています。それが基本的に、ソケットを介して通信することを選択した理由であり、「送信メッセージごとに1つの接続」システムではなく、継続的な接続を使用することを選択しました。
実装やリンクに関するアイデアはありますか?