Говоря мое требование: либо пользователь вводит что-то в консоль (из 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
}
Это не имеет смысла, так как Receive() будет продолжать ждать, пока не получит что-то, он никогда не будет одновременно читать из 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) {
}
}
java.nio.channels
, но я не знаю, что именно, потому что сам никогда этим не пользовался. Я бы использовал потоки для решения проблемы, которую вы описываете. - person Solomon Slow   schedule 24.03.2016