【问题标题】:BufferedReader Blocking on readLine()BufferedReader 在 readLine() 上阻塞
【发布时间】:2018-09-26 23:12:09
【问题描述】:

由于某种原因,我无法从服务器上的客户端读取行。客户端能够毫无问题地发送线路,但服务器不会超过 第一次调用 clientIn.readLine()。我认为它正在阻塞,但我不知道如何处理它。

当我在没有服务器端循环的情况下发送行时也会发生这种情况。

客户端.java

public void run()
{
     try {
        socket = new Socket(ip, port);
        System.out.println("Client connected on port: " + socket.getRemoteSocketAddress());
        //wrap streams for ease 
        BufferedReader serverIn =  new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter serverOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
        System.out.println("starting messages");

        //send messages 
        serverOut.println("hello from: " + socket.getLocalSocketAddress());
        serverOut.println("msg1: " + this.hashCode());
        serverOut.println("msg2: final test");
        //close the connection
        socket.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Server.java:

public void run()
{
    System.out.println("Server Running on port: " + serverSocket.getLocalPort());
    while(true)
    {
        try {
            //listen for connections
            Socket client = serverSocket.accept();

            //record sockets 
            connections.put(client.getRemoteSocketAddress(), client);

            //wrap streams for ease 
            BufferedReader clientIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter clientOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())));

            //send messages
            String line = null;
            while((line = clientIn.readLine()) != null)
            {
                System.out.println(line);
            }

            //ends the connection
            client.close();
            System.out.println("Client disconnected");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

    标签: java sockets bufferedreader printwriter


    【解决方案1】:

    你需要flush()你的serverOut writer,否则你的消息会留在BufferedWriter的缓冲区中,永远不会发送到服务器。

    【讨论】:

    • 我知道打印写入器有一个用于发送数据的内部缓冲区,但是它自己发送它需要多长时间。还是会一直等你冲?
    • 不仅仅是 PrintWriter,它也是 BufferedWriter。而且时间无关紧要。 PrintWriter 和 BufferedWriter 只会在缓冲区已满时写入。请参阅 javadoc。
    【解决方案2】:
    socket.close();
    

    您正在关闭应该关闭PrintWriter 的套接字:

    serverOut.close();
    

    当您从下方关闭套接字时,您将丢失 PrintWriter 中的缓冲数据。

    【讨论】:

    • 所以关闭套接字周会终止连接并关闭 iostreams 但不会将缓冲区中的数据刷新到远程端?
    猜你喜欢
    • 2013-08-10
    • 2017-07-09
    • 2011-12-12
    • 2020-12-05
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多