gpt4 book ai didi

java - 套接字编程: notify all clients before shutting server down

转载 作者:行者123 更新时间:2023-12-02 06:53:50 24 4
gpt4 key购买 nike

我正在尝试使用 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 );

每个启动的线程都被添加到 vector 中。

类似于 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

那么为什么客户端不打印消息并退出呢?

最佳答案

如果对方尚未确认所有数据,则不应关闭 TCP 套接字。大多数应用协议(protocol)都设计了这种机制。例如,对于 HTTP、SMTP、IMAP、POP3,服务器会在应关闭连接时发出信号,客户端会关闭套接字,然后服务器会关闭套接字。

根据您的情况,您可以按如下方式扩展 Close 方法:

public void Close() throws IOException {
String outputLine = p.processInput("shut");
out.println(outputLine);
// signal the client that the connection should be closed
socket.shutdownOutput();
// wait on ack by blocking until EOF is received
if (in.read() != -1) {
throw new RuntimeException("unexpected data sent by client");
}
// close socket
socket.close();
}

关于java - 套接字编程: notify all clients before shutting server down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com