gpt4 book ai didi

java - 如何判断当前客户端socket已经关闭并连接到另一台服务器?

转载 作者:行者123 更新时间:2023-12-01 19:04:23 24 4
gpt4 key购买 nike

我想在我的代码中实现一个处理程序,以允许客户端在连接到该客户端的服务器在 10 秒后没有响应的情况下自动连接到同一网络上的服务器的第二个实例。我做错了什么??

private static void connectToServer(String serverHostname, int port) throws UnknownHostException, IOException
{
try {
echoSocket = new Socket(serverHostname, 10118);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket
.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Unknown host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Not connected to server: "
+ serverHostname);
System.exit(1);
}
}





public static void main(String[] args) throws IOException {
listServer.add("10.196.113.31");
listServer.add("10.196.113.27");
BufferedReader stdIn = new BufferedReader(new InputStreamReader(
System.in));
try {


if (args.length > 0)
serverHostname = args[0];
System.out.println("Trying to connect to host " + serverHostname
+ " at port 10118.");


connectToServer(getServer(), 10118);
echoSocket.setSoTimeout(10000);

String userInput;
System.out.print("Input: ");

while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);

if (!echoSocket.isConnected()) connectToServer(serverHostname, 10118);

System.out.println("echo: " + in.readLine());
System.out.print("Input: ");
}
} catch (SocketTimeoutException e) {
NextServer();
connectToServer(getServer(), 10118);
System.out.println("Timeout");
// TODO: handle exception
}


out.close();
in.close();
stdIn.close();
echoSocket.close();
}

private static void NextServer(){
idServer ++;
}

private static String getServer(){
return listServer.get(idServer);
}

编辑

当我运行服务器,然后运行客户端时,一切都很好。然后我在同一网络上的另一台计算机上启动第二个服务器,并尝试从同一客户端发送文本,客户端应该自动检测到第一个服务器已断开连接,连接到服务器的第二个实例并发送文本消息。这是我遇到的异常:

Exception in thread "main" java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) at sun.nio.cs.StreamDecoder.implRead(Unknown Source) at sun.nio.cs.StreamDecoder.read(Unknown Source) at java.io.InputStreamReader.read(Unknown Source) at java.io.BufferedReader.fill(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at Q3.Client.main(Client.java:62)

最佳答案

如果您希望客户端在服务器断开连接时执行某些操作,您需要做的不仅仅是捕获SocketTimeoutException。正如堆栈跟踪所示,断开的连接将导致抛出通用的 SocketException。你也应该明白这一点。

换句话说,您似乎只处理客户端与服务器的初始连接失败的情况;并且您没有处理现有条件被删除的情况。

关于java - 如何判断当前客户端socket已经关闭并连接到另一台服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738561/

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