通过套接字发送的消息未在接收方打印
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,并且循环正确终止。
我目前正在学习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,并且循环正确终止。