如何用java制作扫描块
我正在制作一个多线程服务器客户端应用程序,其中每个客户端都有自己的专用线程。服务器和客户端使用以“END\r\n”结尾的特定消息格式进行通信。为此,我考虑使用Scanner类及其useDellimiter方法。这是密码如何用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
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()
始终阻止,除非流已关闭,在这种情况下没有更多数据。