2

ネットワークを監視するための小さなクライアントを作成するために、いくつかのJavaを使用しています。ネットワーク上の各ノードに対して、クライアントを実行していますが、着信接続をリッスンする ServerSocket も実行しています。私が書いたコードは ServerSocket.listen() メソッドでハングアップしているようです。サーバーソケットを開始する必要があるテストコードを実行しようとしています。セットアップが完了したら、データを送信します。基本的に私の問題は次のようになります。

クライアント.java

/*snip*/
public void listen(){
    try{
        ServerSocket server = new ServerSocket(1234);
        server.listen();
        Socket client = server.accept()
        System.out.println("got connection");
        ... do stuff
    catch(IOException ex){
        ex.printStackTrace();
    }
}

TestClient.java

/*snip*/
Client client = new Client();
client.listen();
System.out.println("client constructed, waiting for connection");
Socket sock = new Socket("localhost", 1234);
... do stuff

Java ServerSocket の他のすべての例は、それ自体をループして無限ループで実行するためだけに、それを独自のクラスに配置します。可能であれば、サーバーを別のメインメソッドから実行しようとしています。問題は、ソケットが接続を取得しないため、client.listen() メソッドが完了しないことです。そのコード行が TestClient で実行された後、接続を確立しようとします。Eclipse では、println のどちらも出力に出力されません。これを巧妙な方法で処理するために制御構造を記述する別の方法はありますか?

4

1 に答える 1

3

おそらく、あなたはこのようなものを探していますか?サーバーソケットを別のスレッドで実行できます

package test;

import java.net.*;

public class Clerver {

    private ServerSocket serverSocket;
    private int listenPort;
    private Thread listenerThread;

    public Clerver(int listenPort) {
        this.listenPort = listenPort;
    }

    public void runIt() throws Exception {

        this.serverSocket = new ServerSocket(listenPort);
        this.listenerThread = new Thread() {
            public void run() {
                synchronized (Clerver.this) {
                    Clerver.this.notify();
                }
                try {
                    Socket clientSocket = Clerver.this.serverSocket.accept();
                    receiveDataOnServer(clientSocket);
                    clientSocket.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };
        this.listenerThread.start();
        synchronized (this) {
            this.wait();
        }
        Socket sock = new Socket("localhost", listenPort);
        sendDataFromClient(sock);
        receiveDataFromServer(sock);
        System.out.println(">> All done!");
        listenerThread.join();
        System.out.println(">> Bye Bye!");
    }

    private void sendDataFromClient(Socket sock) throws Exception {
        sock.getOutputStream().write("Hello".getBytes());
        System.out.println(">> Sent HELLO");
    }

    private void receiveDataFromServer(Socket sock) throws Exception {
        byte[] buf = new byte[1024];
        int bread = sock.getInputStream().read(buf);
        String response = new String(buf, 0, bread);
        System.out.println("<< RESPONSE from SERVER: " + response);
    }

    private void receiveDataOnServer(Socket sock) throws Exception {

        byte[] buf = new byte[1024];
        int bread = sock.getInputStream().read(buf);
        String response = new String(buf, 0, bread);
        System.out.println(">> Received on Server : " + response);
        sock.getOutputStream().write("WORLD".getBytes());
        System.out.println(">> SERVER sent response back");
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Clerver c = new Clerver(1234);
        c.runIt();

    }

}
于 2013-01-28T20:42:26.250 に答える