コードにハンドラーを実装して、このクライアントに接続されているサーバーが10秒後に応答しない場合に、クライアントが同じネットワーク上のサーバーの2番目のインスタンスに自動的に接続できるようにします。私は何が間違っているのですか?
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);
}
編集
サーバーを実行し、次にクライアントを実行すると、すべてが正常になります。次に、同じネットワーク上の別のマシンで2番目のサーバーを起動し、同じクライアントからテキストを送信しようとすると、クライアントは最初のサーバーが切断されていることを自動的に検出し、サーバーの2番目のインスタンスに接続してテキストメッセージを送信する必要があります。これが私が得ている例外です:
スレッド"main"の例外java.net.SocketException:接続がjava.net.SocketInputStream.read(不明なソース)でsun.nio.cs.StreamDecoder.readBytes(不明なソース)でsun.nio.cs.StreamDecoder.implReadでリセットされました(不明なソース)at sun.nio.cs.StreamDecoder.read(不明なソース)at java.io.InputStreamReader.read(不明なソース)at java.io.BufferedReader.fill(不明なソース)at java.io.BufferedReader.readLine (不明なソース)at java.io.BufferedReader.readLine(不明なソース)at Q3.Client.main(Client.java:62)