35

私はPythonで非常に基本的なサーバーを作成しようとしています。このサーバーは、ポートでリッスンし、クライアントが接続を試みたときにTCP接続を作成し、データを受信し、何かを送り返し、再度リッスンします(そしてプロセスを無期限に繰り返します)。これは私がこれまでに持っているものです:

from socket import *

serverName = "localhost"
serverPort = 4444
BUFFER_SIZE = 1024

s = socket(AF_INET, SOCK_STREAM)
s.bind((serverName, serverPort))
s.listen(1)

print "Server is ready to receive data..."

while 1:
        newConnection, client = s.accept()
        msg = newConnection.recv(BUFFER_SIZE)

        print msg

        newConnection.send("hello world")
        newConnection.close()

これは完全に機能しているように見える場合があります(ブラウザーで「localhost:4444」を指定すると、サーバーはHTTP GET要求を出力し、Webページは「helloworld」というテキストを出力します)。しかし、最後の数分間にサーバーを閉じた後にサーバーを起動しようとすると、次のエラーメッセージが散発的に表示されます。

Traceback (most recent call last):
  File "path\server.py", line 8, in <module>
    s.bind((serverName, serverPort))
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

私はWindows7を使用してPythonでプログラミングしています。これを修正する方法について何かアイデアはありますか?

4

7 に答える 7

42

Windowsでは、次の手順を試すことができます。

1.どのプロセスがポートを使用しているかを確認します。

# 4444 is your port number
netstat -ano|findstr 4444

あなたはこのようなものを手に入れるでしょう:

# 19088 is the PID of the process
TCP    0.0.0.0:4444           *:*                                    19088

2.このプロセスを強制終了します

と:

tskill 19088

または:

taskkill /F /PID 19088

幸運を。

于 2016-06-13T21:11:03.743 に答える
31

bind()を呼び出す前に、SO_REUSEADDRソケットオプションを有効にします。これにより、アドレス/ポートは、TIME_WAIT状態で数分間スタックし、遅延パケットが到着するのを待つのではなく、すぐに再利用できます。

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
于 2012-09-11T04:07:35.983 に答える
5

@JohnKugelmanによって投稿された記事SO_REUSEADDRでは、有効にした後でも、ソケットを使用して以前と同じリモートエンドに接続することはできないと述べられています。

SO_REUSADDRを使用すると、TIME_WAITでスタックしているポートを使用できますが、そのポートを使用して、最後に接続した場所への接続を確立することはできません。

あなたはただテスト/遊んでいるようです。ただし、このエラーを回避するには、接続を正しく終了する必要があります。また、オペレーティングシステムのtcpタイミングを台無しにすることもできます:http ://www.linuxquestions.org/questions/linux-networking-3/decrease-time_wait-558399/

テストの目的で、ラウンドロビン方式で変更するだけでも問題serverPortありませんが、どう思いますか?

于 2012-09-11T08:45:48.240 に答える
2

サーバーコードを終了しておらず、別のcmdで再実行しようとしたことが原因である可能性があります。サーバーを同じポート番号でホストすることはできません。以前にホストされていたサーバーを強制終了してみてください。

于 2019-06-24T09:57:50.063 に答える
0

(特にWindowsでは)ソケットを閉じることが重要です。それ以外の場合は、Pythonを閉じた後にタイムアウトするまで待つ必要があります。

だろう:

try:
    while 1:
        newConnection, client = s.accept()
        msg = newConnection.recv(BUFFER_SIZE)

        print msg

        newConnection.send("hello world")
        newConnection.close()
finally:
    s.close()

ヘルプ?

于 2012-09-11T04:15:11.967 に答える
0

サーバーの最後の瞬間を停止せずにサーバーを再実行しようとすると、機能しません。現在のインスタントを停止したい場合はに行きます

シェル->シェルを再起動します。

サーバーを停止せずにシェルを既に閉じている場合は、タスクマネージャーに移動し、バックグラウンドプロセッサーでタスクのPythonプロセスを終了します。これにより、サーバーの最後の瞬間が停止します。

于 2017-07-24T08:49:35.350 に答える
0

ポート番号を別のポート番号に変更しましたが、機能します。

if __name__ == '__main__':
    socketio.run(app, debug = True, use_reloader = False, port=1111)
于 2018-10-17T15:59:14.513 に答える