gpt4 book ai didi

java - 如何用java制作扫描仪 block

转载 作者:行者123 更新时间:2023-12-02 10:33:12 25 4
gpt4 key购买 nike

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

关于java - 如何用java制作扫描仪 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53483587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com