1

同じポートに複数のサーバーがあると問題が発生すると予想されます。実際、同じポートで 2 つのサーバーを起動しようとすると、例外をスローする必要があります。問題は、同じポートで複数のサーバーを起動するのが楽しいように見えることです。次のコードの多くのインスタンスを例外なく正常に実行できます。

import BaseHTTPServer
import SimpleHTTPServer
import sys

def main():
    try:
        server = BaseHTTPServer.HTTPServer(('127.0.0.1',5000), SimpleHTTPServer.SimpleHTTPRequestHandler)
        print "On port: " + str(server.socket.getsockname()[1])
    except Exception, e:
        print e
    server.serve_forever()

if __name__ == "__main__":
    main()

これらはすべて、ポート 5000 にあると主張しています。既に使用されているポートを使用しようとした場合、例外をスローするにはどうすればよいですか?

編集:これはPython 2.6.4です

編集 2: http://www.youtube.com/watch?v=rVOG3JdbHAM&feature=youtu.be私が説明していることは不可能だと思われているのでしょうか? または、私は人々を完全に誤解しています。いずれにせよ、このビデオはそれをクリアするはずです。2 つのサーバーを起動しましたが、どちらも例外を出力しません。最初のものを閉じると、2番目が機能し始めます。なぜこうなった?2番目のサーバーが起動して例外を出力することは決してないと思います。これは起こるべきことではありませんか?

4

3 に答える 3

1

あなたのコードを実行しようとしましたが、2 番目のインスタンスが返されました。

 [Errno 98] Address already in use

あるべきように。SuSE Linux 上の Python 2.6。

ポート 5000 が本当に使用されているかどうかを netstat ユーティリティで確認できますか?

于 2012-07-19T22:40:51.643 に答える
0

TCP ポートは、1 つのプロセスだけによってバインドできます。@phihag が指摘したように、複数のサーバーがポート 5000 にバインドされていると考えるだけです。これは、そのポートが既にバインドされていることを示す例外を破棄しているためです。

Windows 7 で実行しています。ポートのステータスが TIME_WAIT としてリストされます。

これは通常、クライアントが接続を適切にシャットダウンしていないことが原因で発生する二次的な問題です。TIME_WAIT は有効な TCP 状態ですが、サーバーがクリアするのに2 分かかります。サーバーに接続を閉じるのではなく、クライアントが接続をドロップしている理由を調べる必要があります。

クライアント側で標準ブラウザを使用している場合は、サーバー コードにここに示していない 2 つ目のバグがあると想定する必要があります。

コメントに応じて追加されました

あなたの期待には何か問題があります。このバージョンのコードは、次のことを明確にする必要があります。

def bind():
    return BaseHTTPServer.HTTPServer(('127.0.0.1',5000), SimpleHTTPServer.SimpleHTTPRequestHandler)

s1 = bind()
s2 = bind()

最後の行は、「アドレスは既に使用されています」という例外でプログラムを中止します。例外を無視する (またはキャッチして破棄する) ことを選択した場合s2、有効なサーバーはありません。これは、例外があなたに伝えていることです。C で、同じようにエラーを無視すると、次のようになります。

fp = fopen("a_file_that_does_not_exist", "r")
fgets(buf, BUFSIZ, fp)

fopenとの両方fgetsが返さEOFれますが、無視しています。プログラムは実行されますが、存在しないファイルから読み取ることはできないため、何の役にも立ちません。エラー リターンは無視できますが、目を覆ってもモンスターが消えることはありません。

于 2012-07-19T23:00:39.720 に答える
0

単一の TCP ポートに対して複数のリスナーを持つことはできないことを示すさまざまな回答とコメントに同意します。ただし、OP と同じ動作が発生しています。Windows 8 を実行していますが、私のプログラム (Boost を使用して C++ で記述) のどちらのインスタンスにも例外がスローされません。からの出力はnetstat次のようになります。

C:\windows\system32>netstat -an

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:7112           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:17500          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49152          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49153          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49154          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49155          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49157          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:50102          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:50102          0.0.0.0:0              LISTENING
  TCP    127.0.0.1:2559         0.0.0.0:0              LISTENING
  TCP    127.0.0.1:19872        127.0.0.1:49248        ESTABLISHED
  TCP    127.0.0.1:49248        127.0.0.1:19872        ESTABLISHED
  TCP    127.0.0.1:50102        127.0.0.1:52616        TIME_WAIT
  TCP    127.0.0.1:50102        127.0.0.1:52618        TIME_WAIT
  TCP    127.0.0.1:50102        127.0.0.1:52620        TIME_WAIT
  TCP    127.0.0.1:50102        127.0.0.1:52622        TIME_WAIT

この場合、ポート 50102 のリッスンを開始する最初のプログラム インスタンスが、すべてのクライアント接続を受信します。次に、そのインスタンスを閉じると、2 番目のインスタンスがクライアント接続の受信を開始します。奇妙ですが本当です。

2 番目のプログラム インスタンスが最初のインスタンスと同じポートのリッスンを開始できないことを期待していました。

于 2014-03-05T15:15:02.240 に答える