0

サーバーソケットに接続されたクライアントソケットがあります。サーバーは、接続中に時々クライアントにデータを送信します。現在、クライアントはwhileループを使用して、サーバーが何も送信していなくてもサーバーからデータを受信し続けています。

私の質問は、入力をリッスンするより効率的な方法はありますか?

ソケット接続用のスレッドを作成し、着信データがないときにスリープ状態にし、着信データがあるときに割り込みを送信することを考えています。それはうまくいきますか? スレッドをスリープ状態にすると、ソケット接続が切断されますか?

サーバーソケットを変更できず、接続を開始しません。

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

public class core_socket {
    public static void main(String[] args) {
        String host = ("192.168.100.206");
        int port = 4025;
        try {
            Socket socket = new Socket(host, port);

            System.out.println("created socket\n");
            OutputStream os = socket.getOutputStream();
            boolean autoflush = true;
            PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // read the response
            boolean loop = true;
            StringBuilder sb = new StringBuilder(8096);
            while (loop) {
                if (in.ready()) {
                    int i = 0;
                    while (i != -1) {
                        i = in.read();
                        sb.append((char) i);
                    }
                    loop = false;
                }
            }

            // display the response to the out console
            System.out.println(sb.toString());

            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4

2 に答える 2

0

http://cs.lmu.edu/~ray/notes/javanetexamples/にあるマルチユーザー チャット アプリケーションの例を参照してください。基本的には、着信接続ごとに新しいワーカー スレッドを生成することを検討してから、戻って新しい接続をリッスンする必要があります。着信要求。

ずっと前に、私は最初のアプリケーション サーバーの 1 つを作成しました (たとえば、ほとんどの人がアプリ サーバーが何であるかを知らなかった 1997 年に)。それは最大の高等教育機関の 1 つに展開され、1 日あたり数百万のリクエストを処理しました。ピーク時間 - ちなみに、それはリンクの機関ではありません. 私がこれに言及する理由は...マルチスレッドは、非常に少ない労力で驚異的なスケーラビリティを提供します.スケーラビリティがあなたが探しているものではない場合でも、ワーカースレッドモデルは依然として良い習慣です.

于 2013-05-29T16:28:40.000 に答える
0

おそらく、あなたが望むのは非同期ソケットを使用することです。基本的に、ソケット上のデータをリッスンする別のスレッドをスピンオフします。データが入ってくると、「コールバック」メソッドが呼び出され、データの処理を開始できます。

私はこれまでJavaでソケットをやったことがなく、C#だけだったので、それがどのように比較されるかはわかりませんが、概念は同じままです。

于 2013-05-29T16:23:56.617 に答える