【问题标题】:Handling socket.close() gracefully优雅地处理 socket.close()
【发布时间】:2012-05-29 18:53:04
【问题描述】:

在我位于 android 设备中的服务器中,如果客户端数量超过特定数量,则服务器关闭套接字。但是在我的客户端(其他 android 设备)中,我强制关闭。我怎样才能优雅地处理它? 这是我客户端上的连接部分:

    serverIpAddress = serverIp.getText().toString();

    if (!serverIpAddress.equals(""))
    {
            try
            {
                 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                 SocketAddress sockaddr = new InetSocketAddress(serverAddr, 5000);
                 nsocket = new Socket();
                 nsocket.connect(sockaddr);                    
            }catch(Exception e){
                 Log.i("Connect", "Connection Error");
            }

            if (nsocket.isConnected()){
                  score.setText("Your score is " + sc);
                  serverIp.setVisibility(View.GONE);
                  connectPhones.setVisibility(View.GONE);
                  enterIP.setVisibility(View.GONE);
                  Log.i("Connect", "Socket created, streams assigned");
                  Log.i("Connect", "Waiting for inital data..." + nsocket.isConnected());
                  receiveMsg();
            }

【问题讨论】:

  • 向您通过套接字使用的协议添加一个关闭过程。我们很难帮助您做到这一点,因为我们不知道您的协议是什么。也许服务器可以向客户端发送“稍后再试”消息,然后客户端会关闭套接字?这样,服务器只有在客户端没有响应时才会关闭,并且通常它会干净地发生。

标签: java android sockets client client-server


【解决方案1】:

继续检查套接字连接是否仍然打开或没有在无限循环中使用 isClosed(),当服务器关闭其连接时,isClosed() 变为真,然后显示一条消息或 toast,向用户提供您想要的理由。

【讨论】:

    【解决方案2】:

    听起来您用来读取套接字的任何内容都是阻塞读取,并且当套接字关闭并且卡在该读取时会引发异常。确保 read 在 try 块中,并使用 catch/finally 优雅地退出您当时正在执行的任何操作。

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多