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

Java 通过套接字发送的消息未在接收端打印,java,network-programming,Java,Network Programming,我目前正在学习Java,我试图制作一个简单的聊天程序,在服务器和客户端之间进行通信。我的问题是这两个程序彼此正确连接,但发送的消息无法打印出来。我不知道是发送部分还是接收部分。不要评判我的班级命名,这只是暂时的 接收的客户端部分: InputStream is = chatterSock.getInputStream(); OutputStream os = chatterSock.getOutputStream(); Thread readThread = new Thread(()

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

接收的客户端部分:

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

    }

正如@Russell Uhl在他的评论中提到的,一个读循环的终止条件是reader.readLine!=null仅在输出流关闭时终止

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

如果您不发送换行符,它也将无限期地等待,这就是为什么您被告知将其添加到write命令中

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


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

字符串是否包含\n?取决于用户输入。刚刚测试过它。但是没有换行符也不行…你能为你的服务器端添加代码吗?这里有几个潜在的问题。既然你说它们是相似的,我也不确定写操作放在哪里了。虽然这可能与你的问题无关,但无论是在写没有参数的getBytes还是读只有一个参数的InputStreamReader构造函数时,你都在使用默认的平台字符集。如果客户端和服务器上的默认字符集不同,文本可能会被篡改。如果发送方不发送换行符,接收方将在readLine方法中永远等待。receive和where在自己的线程中。但随着换行符和print命令在内部while循环中的使用,现在已经开始工作了。
<Socket>.getOutputStream().write(<String>.getBytes());
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
    }
});