Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 BufferReader意外行为_Java_Sockets_Bufferedreader_Serversocket_Printwriter - Fatal编程技术网

Java BufferReader意外行为

Java BufferReader意外行为,java,sockets,bufferedreader,serversocket,printwriter,Java,Sockets,Bufferedreader,Serversocket,Printwriter,我正在尝试使用线程运行方法从套接字读取数据: @Override public void run() { while(true){ try{ String o = ""; socketServer = new ServerSocket(port); System.out.println("Waiting for connection on port "+port+"."); S

我正在尝试使用线程运行方法从套接字读取数据:

@Override
public void run() {
    while(true){
        try{
            String o = "";
            socketServer = new ServerSocket(port);
            System.out.println("Waiting for connection on port "+port+".");
            Socket socket = new Socket();
            socket = socketServer.accept();
            System.out.println("Connection got.");
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            int c;
            while(( c = input.read()) != -1)
                o += (char)c;
            PrintWriter output = new PrintWriter(socket.getOutputStream());
            output.println("ok");
            output.flush();
            output.close();
            input.close();
            socket.close();
            socketServer.close();
            textFieldMessage.setText("Сообщение от "+socket.getInetAddress().getCanonicalHostName()+":\n"+o);
        }catch(Exception e){
            e.printStackTrace();
            System.exit(-1);
        }

    }
}
但它在循环时被卡住了。调试器告知最后没有-1值。
这里出了什么问题?

因为您正在从套接字读取数据,除非套接字或流已关闭,否则您永远无法到达流的末尾。因此while循环将阻塞
input.read()
,因为在客户端关闭流/套接字之前,它不会返回-1

不确定从套接字读取的是什么,但可以尝试使用BufferedReader的
readLine()
方法。您可以知道需要提前阅读多少行,也可以在阅读结束时使用空行(如HTTP)

InputStream的read()方法会阻塞数据,直到数据可用为止

只有在检测到流的结尾时,它才能返回-1(虽然套接字不应该是这种情况),因此如果数据不可用,while循环将阻塞,即您的read调用将等待数据被读取

注:


但如果值为-1,则程序应该已退出。那么你在读什么呢?

对等方没有关闭套接字,因此你永远不会得到-1,因此你在收到最后一个字符后阻塞了
read()
调用。你的策略有缺陷。您正在阅读EOS,然后希望能够撰写回复。除非对等方关闭套接字以进行输出,然后读取,否则这将永远不会起作用。您需要正确定义应用程序协议。目前,您希望对等机执行写/关闭/读取操作。没有意义。

套接字流没有文件结束概念,因此,您永远不会得到-1(除非您在另一端播种值;)@MadProgrammer当然,它们有“文件结束概念”。Peer关上他的插座,你读到一个EOS。@EJP这是一个公平的观点