私の要件は次のとおりです: コンソール(system.in)のコンソールまたはソケットの何かが何かを受け取った場合、次のステップに進みます。スレッドを使用せずにjava system.inを入力ソースコードと同時に使用することができます
だから私は、スキャナ
Scanner sc = new Scanner(System.in);
は、UDPクライアントを持っています。 (別の入力ソース)
DatagramSocket clientSocket = new DatagramSocket();
は私のコードは
while (true) {
if (sc.hasNext()) {
String str = sc.next();
proceed(str)
} else {
clientSocket.receive(pack);
proceed(pack)
}
}
明らかにこのコードは動作しませんです。 sc.hasNext()をチェックすると、javaはユーザがコンソールに何らかの入力を入力するのを待っているからです。現在私ができることは、Udpクライアント用のスレッドを開くことです。私は順序を変更する場合は、
while (true) {
clientSocket.receive(pack);
if (not receive) read from system.in
}
それは意味がない、以来()を受け取るutilのは、何かを受信待機し続けるだろう、それは同時にはSystem.inから読み取ることはありません。
スレッドを使用せずにどのように私の要件を達成することができますか? @Andriy Kryvtsunの答えに触発さ
彼が言ったように、私は、簡単なテスト をした、これは何とか
InputStream ins = System.in;
byte buffer[] = new byte[512];
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
DatagramSocket clientSocket = new DatagramSocket();
System.out.println("From buffer:" + clientSocket.getLocalPort());
while (true) {
try {
if (ins.available() > 0) {
String line = reader.readLine();
System.out.println("Read:" + line);
} else {
DatagramPacket pack = new DatagramPacket(buffer,buffer.length);
clientSocket.setSoTimeout(2000);
clientSocket.receive(pack);
System.out.println("Receive: " + new String(pack.getData()));
}
} catch (IOException e1) {
}
}
System.inはブロッキングストリームなので、ブロックする時間の制限はありません。ソケット処理にはスレッド(または2つ)を使用する必要があります。 –
'java.nio.channels'パッケージから何かを使いたいと思うかもしれませんが、私は自分自身を使ったことがないので正確に何を知りません。あなたが記述した問題を解決するためにスレッドを使用します。 –
はい。私はまた、それらの非ブロッキングなものを発見した。 requriementはスレッドを使用しないためです。私はノンブロッキングな方法を見つけなければなりません。 – TTTTTAAOOOO