Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 scanner在.next()处阻塞,此时它不应';T_Java_Network Programming_Java.util.scanner_Inputstream_Outputstream - Fatal编程技术网

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());
    }