2

クライアントからの応答を待っているサーバー側プログラミングの簡単なコードを作成しました。これは正常にcmd.exe実行されますが、Eclipseで実行中に例外がスローされます。例外の詳細は次のとおりです。

スレッド「メイン」での例外 java.net.BindException: アドレスは既に使用されています: JVM_Bind

これは日食でのみ発生しています。日食でどのように機能しているのか、どのように機能しているのか教えてください。cmd.exe

サーバー側プログラムのコードは次のとおりです。

package networking;

import java.io.*;
import java.net.*;

public class Server1 {
    public static void main(String args[]) throws Exception {
        ServerSocket sock = new ServerSocket(5000);
        Socket s1 = sock.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(
                s1.getInputStream()));
        String msg = br.readLine();
    }

}
4

2 に答える 2

1

「Server1」の起動時にソケットが開いています。

これは、次の場合に発生する可能性があります。

  • Server1すでに実行されています。(あなたはそれを殺しませんでした、そうである可能性が高いようです...)
  • 別のプロセスがポート 5000 でリッスンしています。
  • ポートはまだ完全に閉じられていませんが、しばらくの間「待機中」の状態でスタックしています。(ソケットが接続されているときにサーバーが強制終了された場合に発生する可能性があります。)

しかし!推測する代わりに、何が起こっているのかを確認するだけです: Microsoft の TCPView をダウンロードして見てください:

http://technet.microsoft.com/en-us/sysinternals/bb897437

(コマンド ウィンドウで netstat -a を使用することもできます。)

いくつかのメモ:

ポート番号

ポート 5000 は uPnP で使用されているように見えるため、おそらく使用しないでください。一部のマシンではポートが常に開いていることがあります... ここを確認してください:

http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

5桁の数字を試してみてください:-)

Time_wait

Java ネットワーク サーバーと TIME_WAITに関するこの質問を確認してください。

受け入れられるべき答えは、ウィンドウを減らすために次のオプションを提供します。

setSoLinger(true,0)

setReuseAddress(true)

(クライアントが送信が失敗したことに気付かない可能性があるため、サーバーを強制終了するとデータが失われるリスクがあります。昔は、データも混同される可能性がありましたが、それはもはや当てはまりません。)

于 2013-05-08T06:13:27.043 に答える