1

初めて PHP ソケット サーバー用のクライアントを作成しようとしましたが、少し問題が発生し、情報が殺到しています。

サーバーでは、開いている接続が必要です。入力ストリームの解析を開始するようにスレッドに通知する前に、データを受信するまでクライアント側を待機させます。これは、ループを使用せずに達成できますか? lock.notify() を呼び出せるようにしたいです。

私もNIOを見ていましたが、これは私が望むものの実行可能なオプションですか? ここに私がこれまでに持っているコードがありますが、繰り返しますが、for(;;) を避けようとしているだけで、受信したメッセージは JSON である可能性が高いため、キューに入れることさえできます。

 Thread serverRecieve = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            for (;;) {
                if (in != null) {
                    String line;
                    while ((line = in.readLine()) != null) {
                        sout(line);
                    }
                } else {
                    sout("inputstream is null! Waiting for a second to test again");
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(WebManager.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(WebManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
});

みんなありがとう!PS: ここでたくさんのソケット スレッドを調べましたが、必要なものを尋ねるだけの方が簡単だと判断しました。

4

2 に答える 2

0

whileループを使用して、次のように条件を設定できると思いますin != null

    while(in == null){
       //wait for a second before checking the in stream again
       try {
            sout("inputstream is null! Waiting for a second to test again");
            Thread.sleep(1000);
       } catch (InterruptedException ex) {
          Logger.getLogger(WebManager.class.getName()).log(Level.SEVERE, null, ex);
       }    
    }

     //now your in is available. Read the data and proceed
     String line = null;
     while ((line = in.readLine()) != null) {
          sout(line);
     }

最初のループは、ストリームが利用可能whileになるとすぐに終了します。in

于 2012-11-27T21:07:50.827 に答える
0

Runnable次のように、ソケットからの読み取り専用のサブタイプを作成するのはどうでしょうか。

class Reader implements Runnable {

    private final Socket socket;
    private volatile boolean stopped;

    Reader(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            while (true) {
                int in = socket.getInputStream().read();
                // process in here
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (!stopped) socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void stop() {
        try {
            stopped = true;
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Client {
    private volatile Reader reader;
    void start() {
        reader = new Reader(new Socket(serverHost, serverPort));
        Thread readerThread = new Thread(reader, "Reader-thread");
        readerThread.start();
    }
    void stop() {
        Reader reader = this.reader;
        // reader.stop() will close socket making `run()` method finish because of IOException
        // reader.socket is final, thus we have proper visibility of it's values across threads
        if (reader != null) reader.stop();
    }
}
于 2012-11-27T21:31:25.377 に答える