【问题标题】:How wait a ServerSocket connection on client Socket如何在客户端 Socket 上等待 ServerSocket 连接
【发布时间】:2011-12-10 11:58:21
【问题描述】:

我想知道,如何在 Socket 客户端等待 ServerSocket 连接。

当我首先执行服务器(发送)时,它会使用 ServerSocket.accept 方法等待客户端连接。问题是如果没有先执行服务器,就无法执行客户端(接收)。我想添加一个条件以允许客户端等待来自服务器的连接。有可能吗?

发送(服务器)

ServerSocket servsock = new ServerSocket(1234);
Socket sock = servsock.accept();

接收(客户端)

Socket sock = new Socket(from, 1234);

错误(客户端)

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)

谢谢。

【问题讨论】:

    标签: java sockets serversocket


    【解决方案1】:

    没有内置的方法可以做到这一点。您必须在客户端捕获异常,并自己实现重试机制。

    伪代码:

    Socket sock = null;
    while (retryCounter < threshold) {
      try {
       retryCounter++;
       sock = new Socket(form, 1234);
      } catch (...) {
        // handle exceptions
        // possibly add a sleep period
      }
    }
    if (sock == null) {
      // you failed to connect
    } else {
      // you're connected
    }
    

    如果您有 GUI,请小心:您可能需要在单独的线程中实现其中的一些功能,或者使用计时器来避免冻结您的 UI。

    【讨论】:

    • 我应该在 catch(...) 中添加什么?
    • 您应该处理您希望重试发生的异常。发生这种情况时在某处记录一些内容,如果存在“致命”异常(即重试无法解决的异常),请退出。这是非常通用的,这完全取决于您的应用程序需要什么。
    • 对不起,我不明白。有没有简单的方法,比如发送 ping 或连接测试?
    • 这是一个连接测试。 Ping 一点用都没有。而且它并不复杂,它只是一个循环中的 try/catch。如果您觉得奇怪,请将 try/catch 移至单独的函数。
    【解决方案2】:

    感谢 Mat,它成功了。

        Socket sock = null;
        while (true) {
          try {
           sock = new Socket(from, 1234);
           if (sock != null) { break; }
           }
          catch (IOException e) { Thread.sleep(1000); }
        }
        // rest of the code
    

    【讨论】:

    • sock 在你测试它的地方不可能为空。只需break
    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2019-09-20
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多