代码之家  ›  专栏  ›  技术社区  ›  jc1850

socket()未在服务器未运行的情况下引发异常

  •  0
  • jc1850  · 技术社区  · 6 年前

    我已经编写了一个客户端,在Android设备(Android6)上运行,当服务器启动并运行时,它会连接,但是当服务器关闭时,socket()调用会抛出一个异常,但它不会。

    我最初用NDK尝试过,遇到了一个非常相似的问题。( Android NDK socket connect() returning 0 when it should fail whilst on 3g )

    我假设这是Android在这一点上的一个bug,但是任何对解决方案或解决方案的洞察都会受到赞赏。

    相关代码:

    public class Client implements Runnable{
    
        private Socket socket;
        private InetAddress IP;
        private int port;
    
        public Client(int port){
            try {
                this.IP = InetAddress.getByName(server ip);
            }
            catch(UnknownHostException e){
                Log.d("App1", "Unknown Host, connection failed");
                System.exit(1);
            }
            this.port = port;
            Log.d("App1", "initialised");
        }
    
        @Override
        public void run(){
            try {
                this.socket = new Socket(this.IP, this.port);
                Log.d("FiX1", "Connected");
                listen();
            }
            catch(IOException e){
                Log.d("FiX1,","connection failed");
                System.exit(1);
            }
            finally
            {
                try{
                    socket.close(); // dispose
                }
                catch(IOException e){
                    System.exit(1);
                }
    
            }
    
    
        }
    
       public void listen() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
                while (true) {
                    String cominginText = "";
                    try {
                        cominginText = in.readLine();
                        Log.d("FiX1",cominginText);
                    } catch (IOException e) {
                        //error ("System: " + "Connection to server lost!");
                        System.exit(1);
                        break;
                    }
                }
            } catch (IOException e) {
                System.exit(1);
            }
        }
    
    
    
    }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   kordax    6 年前

    您应该尝试从套接字读取。

    没有例外,因为没有输入或输出。 尝试 socket.getInetAddress().isReachable(int timeout) socket.getInputStream().read() 在另一个线程中超时。 socket.getinputstream().read()正在阻塞调用,因此它将阻塞,直到某些数据到达输入流。

        2
  •  0
  •   jc1850    6 年前

    我能找到的最佳解决方案是从服务器手动发送一个确认连接已建立的确认,如果客户端在声明连接后的某个时间内没有收到此消息,它将重试连接。

        3
  •  -1
  •   Arif Mahmood    6 年前

    TCP连接“关闭”与“断开”之间存在差异。 如果您使用socket.close()关闭服务器的socket连接,那么如果您尝试从该连接中读取,或者相反,您将在客户端获得异常。

    但是,如果一方刚刚消失(关闭程序),那么另一方就没有办法知道这一点。因此,另一方将等待读调用的响应。

    TCP协议被设计成在恶劣的通信环境中是可靠的,它通常不会因为一段时间没有从另一方听到消息而决定一个连接被关闭。