Как сделать блок сканера в Java - PullRequest
0 голосов
/ 26 ноября 2018

Я делаю многопоточное сервер-клиентское приложение, где каждый клиент имеет свой собственный выделенный поток.Сервер и клиент обмениваются данными в определенном формате сообщений, который заканчивается на «END \ r \ n».Для этого я подумал об использовании класса Scanner и его метода useDellimiter.Вот код

     private static String getMessage(InputStream input) throws IOException {
           Scanner n = new Scanner(input); 
           n.useDelimiter("END\r\n");
           while(!n.hasNext()) {} 
           return n.next(); 

     }

Проблема, с которой я столкнулся, заключается в том, что n.next () не блокируется, если сообщение недоступно, а выдает исключение.Я исправил это с помощью базового опроса с помощью цикла while, он работает, но это кажется плохой практикой.Могу ли я сделать блок n.next ()?Есть ли лучший способ достичь того, чего я хочу, без использования класса Scanner?

1 Ответ

0 голосов
/ 26 ноября 2018

Вот отдельная программа, которая показывает, что hasNext() блокируется, как и ожидалось, когда нет ввода.Он блокируется до тех пор, пока поток не будет закрыт, и в этот момент больше нет данных.

    ServerSocket ss = new ServerSocket(0);
    Socket s = new Socket("localhost", ss.getLocalPort());
    Socket s2 = ss.accept();
    Scanner scanner = new Scanner(s.getInputStream());
    scanner.hasNext();

блоков, и дамп потока показывает

"main" #1 prio=5 os_prio=0 cpu=578.13ms elapsed=12.74s tid=0x000001eda6aee000 nid=0x6220 runnable  [0x0000004848afe000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(java.base@11.0.1/Native Method)
    at java.net.SocketInputStream.socketRead(java.base@11.0.1/SocketInputStream.java:115)
    at java.net.SocketInputStream.read(java.base@11.0.1/SocketInputStream.java:168)
    at java.net.SocketInputStream.read(java.base@11.0.1/SocketInputStream.java:140)
    at sun.nio.cs.StreamDecoder.readBytes(java.base@11.0.1/StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(java.base@11.0.1/StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(java.base@11.0.1/StreamDecoder.java:178)
    - locked <0x00000007ffc9b270> (a java.io.InputStreamReader)
    at java.io.InputStreamReader.read(java.base@11.0.1/InputStreamReader.java:185)
    at java.io.Reader.read(java.base@11.0.1/Reader.java:189)
    at java.util.Scanner.readInput(java.base@11.0.1/Scanner.java:882)
    at java.util.Scanner.hasNext(java.base@11.0.1/Scanner.java:1446)
    at A.main(A.java:33)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...