gpt4 book ai didi

java 扫描仪在 .next() 不应该阻塞时阻塞

转载 作者:行者123 更新时间:2023-11-30 03:13:25 25 4
gpt4 key购买 nike

我正在创建一个简单的服务器/客户端应用程序。服务器将 socket.getInputStream() 包装在 Scanner 中。客户端从 System.in 获取用户输入,并使用 PrintWriter 将其发送到服务器。服务器将 scanner.hasNext() 计算为 true,但它会在接下来的 scanner.next() 调用处阻塞。根据 javadoc:

This method may block while waiting for input to scan, even if a previous invocation of hasNext() returned true.

嗯..这有什么意义呢? 编辑:值得注意的是,当客户端终止时,服务器现在继续调用scanner.next()。额外问题:客户端实例化 PrintWriter ,其中 autoFlush 参数为 true,但我需要在每次调用 .write 后刷新()。为什么?这是我的代码的 MCV:

import java.io.IOException;
import java.net.ServerSocket;
import java.util.Scanner;

public class MCVServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1337);
Scanner fromClient = new Scanner(server.accept().getInputStream());
while (fromClient.hasNext()) {
System.out.println("server heard something: ");
System.out.println(fromClient.next());
}
}
}
<小时/>
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class MCVClient {

public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost", 1337);
Scanner input = new Scanner(System.in);
PrintWriter output = new PrintWriter(socket.getOutputStream(), true);

while(true) {
output.write(input.next());
output.flush();
}
}
}

最佳答案

方法 next() 和 hasNext() 的行为按预期工作。 hasNext 方法仅在到达流末尾后才会返回 false。如果 next() 方法仍未到达流末尾或正在等待输入,则该方法将阻塞。

奖励问题也是一个简单的问题。根据 PrintWriter 类的文档:

Unlike the PrintStream class, if automatic flushing is enabled it will be done only when one of the println, printf, or format methods is invoked, rather than whenever a newline character happens to be output. These methods use the platform's own notion of line separator rather than the newline character.

因此,为了使用自动刷新,您需要将 write 方法替换为 println:

while (true) {
output.println(input.next());
}

关于java 扫描仪在 .next() 不应该阻塞时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179209/

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