【发布时间】:2013-07-14 00:52:35
【问题描述】:
我正在尝试使用this 教程实现一个服务器(能够接受多个客户端)和一个客户端并进行一些扩展。 除了一个功能外,一切都很好: 当服务器运行 1 分钟后,它会关闭,每个客户端必须打印消息“服务器正在关闭”并关闭。
在我对 KKMultiServer 的模拟中,我在 main 方法中以这种方式实现它:
long in1minute = 10*1000;
Timer timer = new Timer();
timer.schedule( new TimerTask(){
public void run() {
for(int i=0;i<startedThreads.size();i++){
try {
startedThreads.get(i).Close();
} catch (IOException e) {
e.printStackTrace();
}
}
listening=false;
}
}, in1minute );
每个启动的线程都被添加到向量中。
在我对KKMultiServerThread 的模拟中,此代码应将消息发送给客户端(我对KKProtocol 的模拟正确地进行)
public void Close() throws IOException{
String outputLine=p.processInput("shut");
out.println(outputLine);
out.close();
in.close();
socket.close();
}
服务器正常停止,但客户端不打印消息“服务器正在关闭”。然后,如果我在服务器关闭时调用客户端,我会得到:
[java] Exception in thread "main" java.net.SocketException: Connection rese
tClient: d
[java] at java.net.SocketInputStream.read(SocketInputStream.java:189)
[java] at java.net.SocketInputStream.read(SocketInputStream.java:121)
[java] at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
[java] at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
[java] at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
[java] at java.io.InputStreamReader.read(InputStreamReader.java:184)
[java] at java.io.BufferedReader.fill(BufferedReader.java:154)
[java] at java.io.BufferedReader.readLine(BufferedReader.java:317)
[java] at java.io.BufferedReader.readLine(BufferedReader.java:382)
[java] at ist.assignment2.Client.main(Client.java:31)
[java]
Client.java:31 的代码
while ((fromServer = in.readLine()) != null) {
...然后模拟为KKClient
那么为什么客户端不打印消息并退出呢?
【问题讨论】:
-
还有什么可以关闭套接字的吗?注意你不需要
in.close(),socket.close()应该在 finally 块中。这个协议的目的是什么? 每个客户端设置 1 分钟的读取超时不是更好,如果它触发 然后 发送关闭消息并关闭 那个客户端?我> -
@EJP 不,我发布了所有相关内容。该协议根据客户端输入生成正确的服务器输出。好吧,它是关于实施我现在的想法,而不是实施一些最佳概念。我只是想了解为什么它不起作用。我对 while ((fromServer = in.readLine()) != null) 循环有点困惑。它实际上是如何在需要的时间开始读取每个输入的以及何时退出?
-
readLine()阻塞,直到收到完整的行或 EOS。 -
@EJP 为什么没有线路时循环不退出(如果客户端没有发送任何内容)?直到那时循环才冻结吗?怎么来的?
标签: java sockets client-server