【发布时间】:2014-07-30 23:21:36
【问题描述】:
我不确定这个问题是否与网络有关,但我正在尝试让一个简单的服务器向多个客户端发送消息。在我自己的计算机上测试时它工作正常,但通过网络连接到另一台计算机时会出现问题。
客户端连接到服务器正常,发送给客户端的第一条消息应该是“服务器:你好,世界!”,但一个空白字符串通过。然后第二个字符串总是按原样读取,而所有其余的通常都作为空白字符串出现。服务器使用 autoflush 通过 PrintStream 发送信息。
下面是读取输入的客户端程序部分。我相信如果有的话,这里有一个问题,但我不确定是什么,因为我对套接字和网络事物有点陌生。服务器每 500 毫秒发送一行文本,计数到每个客户端。我尝试将此数字更改为更高的数字,但客户端仍然没有收到正确的消息。客户端应收到消息并将它们打印到屏幕上,并在 5、10、15 和 20 处回复如下所示的回复。
try {
socket.setSoTimeout(10);
String line;
while((line = input.readLine())!=null){
if (!line.equals("")){
// Replies
if (output != null) {
if (line.endsWith(" 20")){
output.println("Reached 20!");
}else if (line.endsWith(" 15")){
output.println("Reached 15!");
}else if (line.endsWith(" 10")){
output.println("Reached 10!");
}else if (line.endsWith(" 5")){
output.println("Reached 5!");
}
}
messages.add(line);
if (messages.size() >= 8){
messages.remove(0);
}
}else{
messages.add("EMPTY STRING!!");
if (messages.size() >= 8){
messages.remove(0);
}
}
}
} catch (SocketTimeoutException e){
// Timed out
} catch (Exception e) {
System.err.println("Connection lost");
break;
}
(快速编辑:可能应该提到这是在 run 方法内的 while 循环中,因为我在我的类上实现了 Runnable。)
当使用 input.readLine() 时,我是否应该在之前检查一些内容以确保它不会只是空字符串?是因为我设置了超时吗?
提前致谢,我还要提一下我是stackoverflow的新手,如果我做错了什么,请说! :)
【问题讨论】:
-
是的。原来它只是 .setSoTimeout(10),我把它设置为 1 秒 (1000),现在它工作正常。我想因为通过网络它要慢得多,所以需要更高的数字。我也可能会低于 1 秒,但这似乎足以满足我的需要。无论如何感谢人们。 :)
-
可能想将您的评论放在答案中 - 您可以回答自己的问题。这样,人们就不会认为问题仍然悬而未决。
标签: java sockets jakarta-ee networking client