Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java制作扫描块_Java_Sockets_Blocking - Fatal编程技术网

如何用java制作扫描块

如何用java制作扫描块,java,sockets,blocking,Java,Sockets,Blocking,我正在制作一个多线程服务器客户端应用程序,其中每个客户端都有自己的专用线程。服务器和客户端使用以“END\r\n”结尾的特定消息格式进行通信。为此,我考虑使用Scanner类及其useDellimiter方法。这是密码 private static String getMessage(InputStream input) throws IOException { Scanner n = new Scanner(input); n.useDe

我正在制作一个多线程服务器客户端应用程序,其中每个客户端都有自己的专用线程。服务器和客户端使用以“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.下一个()块吗?如果不使用Scanner类,有没有更好的方法来实现我想要的功能?

这里有一个自包含的程序,它显示当没有输入时,
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)
“main”#1优先级=5操作系统优先级=0 cpu=578.13ms已用时间=12.74s tid=0x000001EDA6AE000 nid=0x6220可运行[0x0000004848afe000]
java.lang.Thread.State:可运行
在java.net.SocketInputStream.socketRead0(java。base@11.0.1/本机方法)
在java.net.SocketInputStream.socketRead(java。base@11.0.1/SocketInputStream.java:115)
在java.net.SocketInputStream.read(java。base@11.0.1/SocketInputStream.java:168)
在java.net.SocketInputStream.read(java。base@11.0.1/SocketInputStream.java:140)
在sun.nio.cs.StreamDecoder.readBytes(java。base@11.0.1/StreamDecoder.java:284)
在sun.nio.cs.StreamDecoder.implRead(java。base@11.0.1/StreamDecoder.java:326)
在sun.nio.cs.StreamDecoder.read(java。base@11.0.1/StreamDecoder.java:178)
-锁定(java.io.InputStreamReader)
在java.io.InputStreamReader.read(java。base@11.0.1/InputStreamReader.java:185)
在java.io.Reader.read(java。base@11.0.1/Reader.java:189)
在java.util.Scanner.readInput(java。base@11.0.1/Scanner.java:882)
在java.util.Scanner.hasNext(java。base@11.0.1/Scanner.java:1446)
在A.main(A.java:33)

这是一个独立的程序,它显示当没有输入时,
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)
“main”#1优先级=5操作系统优先级=0 cpu=578.13ms已用时间=12.74s tid=0x000001EDA6AE000 nid=0x6220可运行[0x0000004848afe000]
java.lang.Thread.State:可运行
在java.net.SocketInputStream.socketRead0(java。base@11.0.1/本机方法)
在java.net.SocketInputStream.socketRead(java。base@11.0.1/SocketInputStream.java:115)
在java.net.SocketInputStream.read(java。base@11.0.1/SocketInputStream.java:168)
在java.net.SocketInputStream.read(java。base@11.0.1/SocketInputStream.java:140)
在sun.nio.cs.StreamDecoder.readBytes(java。base@11.0.1/StreamDecoder.java:284)
在sun.nio.cs.StreamDecoder.implRead(java。base@11.0.1/StreamDecoder.java:326)
在sun.nio.cs.StreamDecoder.read(java。base@11.0.1/StreamDecoder.java:178)
-锁定(java.io.InputStreamReader)
在java.io.InputStreamReader.read(java。base@11.0.1/InputStreamReader.java:185)
在java.io.Reader.read(java。base@11.0.1/Reader.java:189)
在java.util.Scanner.readInput(java。base@11.0.1/Scanner.java:882)
在java.util.Scanner.hasNext(java。base@11.0.1/Scanner.java:1446)
在A.main(A.java:33)
可能线程帮助
hasNext()
next()
始终阻止,除非流已关闭,在这种情况下没有更多数据。可能线程帮助
hasNext()
next()
始终阻止,除非流已关闭,在这种情况下没有更多数据。