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

时间:2015-02-18 19:28:12

标签: java network-programming

我目前正在学习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");
        }

    }

服务器端部分非常相似。

发送我刚刚运行的消息

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

我已经尝试过stackoverflow的其他一些帖子,但没有找到适用的方法。谢谢你的帮助!

编辑:这是服务器端:

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

1 个答案:

答案 0 :(得分:0)

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

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

如果你没有通过换行发送它也会无限期地等待,这就是你被告知将它添加到你的写命令的原因。

最好是单独处理您读取的每一行,而不是尝试将它们附加到缓冲区并将它们全部输出。在循环中进行处理。

也许最好在GUI上添加一些按钮来终止聊天。它将禁用GUI的其余部分并关闭输出流,这反过来将导致readLine()返回null,并且循环正常终止。