当前位置: 首页 > 知识库问答 >
问题:

如何确定当前客户端套接字已关闭并连接到另一台服务器?

翟泰
2023-03-14

我希望在代码中实现一个处理程序,如果连接到客户端的服务器在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);
        }

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

线程“main”java.net.socketException中的异常:在sun.nio.cs.streamdecoder.readbytes(未知源)sun.nio.cs.streamdecoder.impread(未知源)sun.nio.cs.streamdecoder.read(未知源)sun.nio.cs.streamdecoder.read(未知源)java.io.inputstreamreader.read(未知源)java.io.bufferedreader.fill(未知源)java.io.bufferedreader.read(未知源)

共有1个答案

岳英耀
2023-03-14

如果您希望客户端在服务器断开连接时执行某些操作,那么您需要做的不仅仅是捕获SocketTimeoutException。如stacktrace所示,删除的连接将导致抛出一般的SocketException。你也应该抓住这个。

换句话说,看起来您只处理从客户机到服务器的初始连接失败的情况;您不处理现有条件被删除的情况。

 类似资料:
  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 问题内容: 我正在通过TCP创建一个Java客户端/服务器应用程序,其中有两个套接字: 一种是交换消息。 二是用于文件传输。 我已经在服务器中创建了两个ServerSockets,以便 通过接受ServerSockets 创建套接字1和2 。 首先,客户端通过第一个套接字发送一些字节, 以便它可以告诉服务器它需要哪个文件。 然后,服务器通过第二个套接字将文件发送给客户端。 客户端收到文件后,尝试将

  • 问题内容: 我必须使用Java的套接字API编写多线程客户端和服务器。客户端和服务器都是多线程的,因此服务器可以处理多个连接,客户端可以测试服务器处理连接的能力。 我的代码在这里:https : //github.com/sandyw/Simple-Java-Client- Server 我有几个可能是相关的问题。一,偶尔会有一个客户端线程抛出 从其位置来看,这意味着服务器在客户端完成从套接字读取

  • 我正在编写一个简单的客户端/服务器套接字程序,其中客户端与服务器连接并通信,然后它们向服务器发送退出消息,然后服务器关闭连接。代码如下所示。 服务器.py client.py 我想要的是万一服务器通过ctrl-c或任何其他方式退出,我希望关闭所有客户端套接字,并将msg发送给客户端,他们也应该在其上关闭套接字。 我在下面除部分之外的部分做了一些工作,但由于某些原因,客户端没有收到服务器发送的消息。

  • 我想用java写一个传输文件套接字程序。但我有问题,如何取消时传输文件。 当我在客户端关闭inputstream时,服务器如何知道它关闭了outputstream。 这是我的代码:客户 ...... 服务器 ...... 但当我关闭inputstream时没有显示任何内容

  • Java: 在C#中-它停止在“receiver=listener.accept();”在java(android)中-它停止于“sender_socket=new Socket(serverAddr,SERVERPORT);”这应该是java套接字函数的问题--需要另一个函数连接到C#-server。