通过套接字发送的消息未在接收方打印

Messages sent over socket not being printed on the receiving side

我目前正在学习Java,我试图制作一个简单的聊天程序,它在服务器和客户端之间进行通信。我的问题是这两个程序相互正确连接,但发送的消息没有打印出来。我不知道它是发送部分还是接收部分。不要评判我的class命名,只是暂时的。

客户端接收部分:

InputStream is = chatterSock.getInputStream();
OutputStream os = chatterSock.getOutputStream();
    Thread readThread = new Thread(() -> {
    while (true) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder out = new StringBuilder();
            String newLine = System.getProperty("line.separator");
            String line;
            while ((line = reader.readLine()) != null) {
                out.append(line);
                out.append(newLine);
            }

            chatter.print("<p>" + out.toString() + "</p>");

        } catch (IOException ex) {
            chatter.printWarning("Connection lost");
        }

    }

服务器端部分非常相似。

发送消息我只是运行

<Socket>.getOutputStream().write(<String>.getBytes());

我已经尝试了一些来自 Whosebug 的其他帖子,但没有找到可行的方法。感谢您的帮助!

编辑:这是服务器端:

InputStream is = chatterSock.getInputStream();
OutputStream os = chatterSock.getOutputStream();

Thread readThread = new Thread(() -> {
    while (true) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder out = new StringBuilder();
            String newLine = System.getProperty("line.separator");
            String line;
            while ((line = reader.readLine()) != null) {
                out.append(line);
                out.append(newLine);
            }
            overlord.print("<p>" + out.toString() + "</p>");

        } catch (IOException ex) {
            overlord.chatterSockList.remove(overlord.chatterSockList.indexOf(chatterSock));
            overlord.printWarning("Connection to " + chatterSock.getInetAddress() + " lost");
            overlord.sendToAll(("User " + username + " disconnected."));
        }
    }

});

编辑:消息发送到这里:

sendButton.addActionListener(e -> {

    try {
        chatterSock.getOutputStream().write((messageArea.getText()+"\n").getBytes());
        messageArea.setText("");
    } catch (IOException ex) {
        System.err.println(ex);
        printWarning("Connection lost"); //TODO heartbeat
    }
});

正如@Russell Uhl 在他的评论中提到的,终止条件为 reader.readLine()) != null 的读取循环只会在输出流关闭时终止。

如果输出流未关闭,则该调用只是等待新信息,并将无限期地继续这样做。

如果您不通过换行符发送,它也会无限期地等待,这就是为什么您被告知将其添加到您的写入命令中的原因。

最好分别处理您阅读的每一行,而不是试图将它们附加到缓冲区并一起输出。在循环内进行处理。

在您的 GUI 中添加一些按钮来终止聊天可能也是个好主意。它将禁用 GUI 的其余部分并关闭输出流,这反过来将导致 readLine() 为 return null,并且循环正确终止。