6

こちらの例に基づいて、ThreadingTCPServer を実行する簡単なテスト アプリ (Python 2.6.1) を作成しました。クライアントがコマンド「さようなら」を送信した場合、サーバーをシャットダウンして、アプリケーションを正常に終了したいと考えています。終了部分は問題なく動作しますが、アプリを再実行しようとすると、次のようになります。

socket.error: [Errno 48] Address already in use

ソケットオプションを設定するためにここに示されている解決策を試しましたが、役に立たなかったようです。サーバーをシャットダウンするさまざまな方法を試しましたが、常に同じエラーが発生します。

私が間違っていることは何か分かりますか?

import SocketServer
import socket
import sys
import threading
import time

class RequestHandler(SocketServer.BaseRequestHandler):

    def setup(self):
        print("Connection received from %s" % str(self.client_address))
        self.request.send("Welcome!\n")

    def handle(self):
        while 1:
            data = self.request.recv(1024)
            if (data.strip() == 'bye'):
                 print("Leaving server.")
                 self.finish()
                 self.server.shutdown()
                 # None of these things seem to work either
                 #time.sleep(2)
                 #del self.server.socket
                 #self.server.socket.shutdown(socket.SHUT_WR)
                 #self.server.socket.close()
                 #self.server.server_close()
                 break


    def finish(self):
        self.request.send("Goodbye!  Please come back soon.")

if __name__ == "__main__":
       server = SocketServer.ThreadingTCPServer(("localhost", 9999), RequestHandler)
       # This doesn't seem to help.
       #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
       #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
       server.serve_forever()
       print("Exiting program.")
4

1 に答える 1

1

まだ答えが見つからない場合は、これが役立つと思います...

強制終了されたプログラムによって開いたままになっているソケットを閉じる方法は?

ただし、これは Alex が提供する解決策と同じであるため、おそらくこれは古い質問を閉じる機会にすぎません。

于 2011-05-06T02:58:22.277 に答える