のドキュメントを見てきましたSocketServer
。ドキュメントから TCP サーバー コードをコピーしたところ、問題なく動作しました。ただし、端末で ctrl-c を押してプログラムを終了し、再度実行しようとすると、次のエラーが発生することに気付きました。
socket.error: [Errno 98] Address already in use
thisとthisを読んで問題を解決する方法を調べました。アドレスの再利用を許可するために、コードに次の行を追加しました。
server.allow_reuse_address = True
上記の行を追加しても、まだ同じ問題が発生しています。また、関数の前後にtry
andを追加し、KeyboardInterrupt 例外をキャッチして and を呼び出し、アドレスが解放されることを期待しています。except
server.serve_forever()
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 を使用してこのコードを実行しています。