1

私が抱えている単純なネットワーク関連の問題だと思います。また、何が .close() されていないかを知ることで、これらすべてがどのように機能するかをよりよく理解するのにも役立ちます。これはかなり単純なことだと思いますが、私にとってはすべてが非常に新しいものです。これがクライアントプログラムです。これを理解できれば、おそらくサーバーを追加できます。ありがとう

    public class Server {
    public static void main(String[] args) {
        start();
    }

    static int start = 0;

    public static void start() {
        try {
            ServerSocket serverSocket = new ServerSocket(4567);
            Socket socket = serverSocket.accept();
            //1) Take and echo input (In this case a message)
            BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = bf.readLine();
            System.out.println("Message recieved from Client:" + message);
            //2) Response of client message
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("Server echoing back the message ' " + message + " ' from Client");
        } catch (IOException e) {
            System.out.println("e " + e);
            System.exit(-1);
        }
        start++;

            clearUp();

        if (start < 5) {
            System.out.println("Closing binds and Restarting" + start);

            start();
        }
    }

    public void clearUp(){
        //How would I clear the stuff that is left bound
          so I can restart via start() and avoid the
          java.net.BindException: Address already in use: JVM_Bind ?
    }

}

start() を介して再起動し、 java.net.BindException: Address already in use: JVM_Bind を回避できるように、バインドされたままになっているものをクリアするにはどうすればよいですか?

4

2 に答える 2

3

問題はこれらの行内にあります。

public static void start() {
    try {
        ServerSocket serverSocket = new ServerSocket(4567);
        //tells server to listen on 4567
 ....

if (start < 5) {
        System.out.println("Closing binds and Restarting" + start);

        start();
}

start を何度も呼び出し、ServerSocket に同じポートでリッスンするように指示しています。

代わりに、サーバーがリッスンするために保持する ServerSocket を 1 つ用意する必要があります。次に、通常の Socket が ServerSocket に接続し、サーバーがその接続に接続します。これにより、両者が通信するためacceptsの新しいものが返されます。Socketあなたの質問は、これがクライアント コードであることを示しているようです。従来のクライアントは、一部のポートでリッスンしていないため、ServerSocket を持つべきではありません。

あなたがしたいのはサーバーです:

  1. 一部のポートでサーバーソケットを作成します。内部でループします。
  2. クライアントからの接続を待つ
  3. 接続を受け入れます。これにより、あなたとクライアントが通信するための新しいソケットが作成されます

クライアント:

  1. サーバーソケットに接続
  2. ソケットを介して話しかけます。

これが意味をなさない場合は、コード例をいくつか挙げることができます。

サーバーが複数のクライアントと通信するには、スレッドを使用する必要があることに注意してください。

于 2013-07-02T23:06:45.037 に答える
0

なぜあなたが再バインドしているのかわからないので、そのビットを削除しました。

また、ソケットを閉じていません。

これらはリソースであるため、Java だけで適切にクリーンアップすることに依存しないでください。

public static void start() {
    ServerSocket serverSocket = null;
    int exitCode = 0;
    try {
        serverSocket = new ServerSocket(4567);
        while(start < 5){
            Socket socket = serverSocket.accept();
            //1) Take and echo input (In this case a message)
            BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = bf.readLine();
            System.out.println("Message recieved from Client:" + message);
            //2) Response of client message
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println("Server echoing back the message ' " + message + " ' from Client");
            // close resource
            socket.close();
            start++;
        }
    } catch (IOException e) {
        System.out.println("e " + e);
        exitCode = -1;
    } finally {
        if (serverSocket != null){
            try {
                // close server
                serverSocket .close();
            } catch (IOException e) {
                System.out.println("e " + e);
            }
        }
    }
    if (exitCode != 0){
        System.exit(exitCode);
    }
}
于 2013-07-03T01:31:23.460 に答える