如何通过套接字正确使用 BufferedReader

How to use BufferedReader correctly with sockets

该应用程序是一个基本聊天客户端。 我有一个 Thread 用于从服务器获取数据。

我想从服务器单独获得每个响应。 它仅在循环中断时在控制台中打印(当我使用应用程序的其他部分发送 "exit" 时)。 所以当 "System.out.println" 响应时 它会立即打印整个缓冲区。

如何让它工作并分别打印每个响应?

谢谢!

编辑!!

服务器响应应在每行后包含“\n”

这种方式适合我。

没有 "\n" 它只是等到循环中断。

有没有更好的方法来解决“\n”问题?

    class ServerThread implements Runnable {
    @Override
    public void run(){
        BufferedReader in = null;
        Socket socket;
        try
        {
            if (Thread.currentThread().isAlive()) {
                sendString("exit");
                Thread.currentThread().interrupt();}

            InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
            socket = new Socket(serverAddress, SERVER_PORT);
            outr = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String serverResponse;
            while((serverResponse = in.readLine()) != null)
            {
                System.out.println(serverResponse);
            }

            in.close();
            outr.close();
            socket.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

您正在使用 BufferedReader 并使用 in.readLine() 阅读它,令人惊讶的是 return 下 响应。 line 是由换行符终止的字符串,因此您的 BufferedReader 必须等到它看到换行符才能 return 您的行。如果您不想在回复中使用换行符,请不要使用 readLine(),而是使用其他 read() 方法之一。