我目前正在学习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
}
});
答案 0 :(得分:0)
正如@Russell Uhl在他的评论中提到的,终止条件为reader.readLine()) != null
的读取循环仅在输出流关闭时终止。
如果输出流未关闭,该调用只是等待新信息,并将继续无限期地这样做。
如果你没有通过换行发送它也会无限期地等待,这就是你被告知将它添加到你的写命令的原因。
最好是单独处理您读取的每一行,而不是尝试将它们附加到缓冲区并将它们全部输出。在循环中进行处理。
也许最好在GUI上添加一些按钮来终止聊天。它将禁用GUI的其余部分并关闭输出流,这反过来将导致readLine()
返回null,并且循环正常终止。