0

簡単なサーバークライアントソケットプログラムを作成しました。サーバーを再コンパイルすると、次のようになります。

java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)
    at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)

したがって、私の質問は、Windows 7の下でソケットを強制終了する方法ですか?Eclipseでそれを殺すための可能な解決策はありますか?

私はあなたの答えに感謝します!

4

4 に答える 4

2

jvmを強制終了すると、問題が発生したときに問題が修正されました。シンプルなサーバーを停止する前に、コード内のソケットを閉じていますか?

于 2012-10-10T13:45:21.693 に答える
2

RGdev のように、接続を開いたままにする javaw プロセスがバックグラウンドで実行されていると仮定します。ただし、使用するポートを占有しているマシン上の別のサーバー プログラムである可能性もあります。

netstatcmd シェルのコマンドを使用して、どのプロセスがどのポートをリッスンしているかを確認できます。次のパラメーターは、(a) サーバーを含むすべての接続を一覧表示し、(b) 接続を開いた実行可能ファイルを表示し、(n) ウェルノウン ポートのサービス名によるポート番号の置換を抑制します。

netstat -abn
于 2012-10-10T13:49:46.543 に答える
0

サーバー側のコードは次のとおりです。

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

public class ServerSide {


    public static void main(String[] args) {

        try
        {
            ServerSocket myServerSocket = new ServerSocket(9999);
            System.out.println("Server is waiting on host" + InetAddress.getLocalHost().getCanonicalHostName() + "port= "+ myServerSocket.getLocalPort());
            Socket skt = myServerSocket.accept();

            BufferedReader myInput = new BufferedReader(new InputStreamReader(skt.getInputStream()));
            PrintStream myOutput = new PrintStream(skt.getOutputStream());

            String buf = myInput.readLine();
            System.out.println("Server readLine");
            if(buf!=null)
            {
                System.out.println("Buf = " + buf);
                myOutput.print("Got it?");
            }
            else
            {
                System.out.println("Nothing returned in server sidex`x  ");
            }
            skt.close();
            System.out.println("Server shutdown");
        }
        catch(IOException e)
        {
            e.printStackTrace();
            System.out.println("Whooops");
        }
    }

}

クリーンアップについてご覧のとおり、私は次のように書いています。

        skt.close();

しかし、これはあなたの問題ではないかもしれません。おそらくあなたの問題は、私が 1 時間前に抱えていたものです ;) 以前はプログラムを実行していましたが、結果が期待したものではなかったので、修正して再度実行しましたが、ポートがビジー状態であるか、すでに使用する!日食で何をしますか?エラーが発生したコンソールの下に、ウィンドウの右側に赤い四角形のボタンがあります。「終了」と書いてあります。それをクリックすると、ポートが解放されます。ところで、両方の (サーバー/クライアント) 側のコンソールを確認することを忘れないでください。

于 2012-10-10T13:59:42.823 に答える
0

プロセスがすでに終了している場合にも、このエラー メッセージが表示されることがあります。TCP には時間待ち状態があります。この状態は、古い接続からの TCP パケットが、同じポートでリッスンしている新しいプロセスに配信されないようにするために使用されます。通常、ServerSocket.setRuseAddress(true)この問題を回避するには、 を使用する必要があります。

于 2012-10-10T14:33:36.273 に答える