0

コードにハンドラーを実装して、このクライアントに接続されているサーバーが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)

4

2 に答える 2

3

サーバーが接続を切断したときにクライアントに何かを実行させたい場合は、単にキャッチする以上のことを行う必要がありますSocketTimeoutException。スタックトレースが示すように、接続が切断されると、ジェネリックSocketExceptionがスローされます。これもキャッチする必要があります。

つまり、クライアントからサーバーへの最初の接続が失敗した場合のみを処理しているように見えます。また、既存の条件が削除された場合は処理していません。

于 2012-05-24T13:43:26.177 に答える
1

サーバーがに応答しconnectないsetSoTimeout場合、そのケースはカバーされないため、接続確立コードにタイムアウトがあることを確認してください。これを書いてください:

SocketAddress a = new InetSocketAddress(serverHostname, 10118);
echoSocket = new Socket();
echoSocket.connect(a, 10000);
于 2012-05-24T13:44:13.760 に答える