java scanner在.next()处阻塞,此时它不应';T
我正在创建一个简单的服务器/客户端应用程序。服务器将java scanner在.next()处阻塞,此时它不应';T,java,network-programming,java.util.scanner,inputstream,outputstream,Java,Network Programming,Java.util.scanner,Inputstream,Outputstream,我正在创建一个简单的服务器/客户端应用程序。服务器将套接字.getInputStream()包装在扫描仪中。客户端从System.in中获取用户输入,并使用PrintWriter将其发送到服务器。服务器将scanner.hasNext()计算为true,但它会在以下scanner.next()调用中阻塞。根据javadocs: 此方法在等待输入扫描时可能会阻塞,即使以前调用hasNext()时返回true也是如此 嗯。。这有什么意义编辑:值得注意的是,当客户端终止时,服务器现在继续调用scann
套接字.getInputStream()
包装在扫描仪中。客户端从System.in
中获取用户输入,并使用PrintWriter
将其发送到服务器。服务器将scanner.hasNext()
计算为true,但它会在以下scanner.next()
调用中阻塞。根据javadocs:
此方法在等待输入扫描时可能会阻塞,即使以前调用hasNext()时返回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());
}
}
}
使用NextLine()而不是Next()
scanner.hasNext()一直读取,直到可以检测到下一个标记的开头。这并不意味着整个令牌已被读取或接收。但是scanner.next()必须读取所有令牌;因此,它可能会阻塞
自动刷新仅在调用println、printf或format方法后有效
方法next()和hasNext()的行为按预期工作。hasNext方法只有在到达流的末尾后才会返回false。方法next()将被阻塞,以防它仍然没有到达流的末尾或正在等待输入
奖金问题也很简单。根据PrintWriter类文件:
与PrintStream类不同,如果启用了自动刷新,则仅在调用println、printf或format方法之一时,而不是在输出换行符时,才会执行自动刷新。这些方法使用平台自己的行分隔符概念,而不是换行符
因此,为了使用自动刷新,您需要用println替换write方法:
while (true) {
output.println(input.next());
}
我不明白。因为流是系统。在
中,它永远不会到达流的末尾,对吗?但是为什么.next()
正在等待输入??流中存在某些内容。在客户端,由于System.in的实现方式(它是BufferedInputStream),需要读取“\n”字符才能将其缓冲区刷新到扫描仪对象。NextLine将强制读取整行,而不仅仅是单词。这可能是造成阻塞的原因。另外,将服务器中的:code
while(fromClient.hasNext()){}code
行替换为code
while(true){}code
,这样它将继续读取。如果检测到“next token”的开头,它一定意味着一个token已经结束,为什么不.next()
接收该标记?你的意思是,这并不意味着已经收到下一个令牌吗?
while (true) {
output.println(input.next());
}