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私は定義にa を追加することでこれを解決しましたhandle()が、これは悪い解決策であると批判され、正しい方法はprocess_requestandshutdownメソッドをオーバーライドすることです。

解決の試み

コードからを削除し、whilenetcat を使用してローカルでサーバーに接続し、メッセージを送信して、接続がいつ閉じられるかを確認しました。

何をオーバーライドする必要があるかを理解するために、接続が閉じられた後のメソッドが何であるかを確認したかったのです。

デバッガーをステップ実行し、serve_forever()コードのこの部分までたどりました。

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

495行目を通過した後(私はそれに入ることができません)、接続は閉じられます。

ソケットを介して接続を維持するのは非常に手間がかかるのではないかと疑っています。それが基本的に、ソケットを介して通信することを選択した理由であり、「送信メッセージごとに1つの接続」システムではなく、継続的な接続を使用することを選択しました。

実装やリンクに関するアイデアはありますか?

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 に答える