SocketServer
のドキュメントを見てきました。ドキュメントからTCPサーバーコードをコピーしましたが、正常に動作します。しかし、ターミナルのプログラムをCtrl-Cキーを押して終了するたびに、もう一度実行しようとしたことに気付きました。 、次のエラーが発生します。
_socket.error: [Errno 98] Address already in use
_
this と this を読んで、問題を解決する方法を調べました。アドレスの再利用を許可するために、コードに次の行を追加しました。
_server.allow_reuse_address = True
_
上記の行を追加しても、同じ問題が発生します。また、server.serve_forever()
関数の周りにtry
とexcept
を追加し、KeyboardInterrupt例外をキャッチして、server.shutdown()
とserver.socket.close()
を呼び出しました。アドレスが解放されることを願っています。
これが私のTCPサーバーコードの全範囲です(注:MyTCPHandlerクラスを除外しました):
_if __name__ == "__main__":
Host, PORT = '', 9999
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((Host, PORT), MyTCPHandler)
server.allow_reuse_address = True
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
try:
server.serve_forever()
except KeyboardInterrupt:
server.shutdown()
server.socket.close()
_
上記のコードを実行してもエラーが発生し、アドレスが最終的に解放されるまで1分近く待つ必要があります。コードを絶えずデバッグおよび変更している場合、これはイライラします。
Raspbian "Wheezy" 7.0を実行しているRaspberryPiでPython 2.7.3を使用してこのコードを実行しています。
...
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer((Host, PORT), MyTCPHandler)
...
allow_reuse_address
は、インスタンスではなく、クラスに存在する必要があります。