我的套接字一个接一个关闭.连接超时



我快疯了!

我正在尝试实现TCP holepunching,作为此操作的一部分,我有一个套接字试图连续连接。

由于某种原因,在第一个mobileSocket2。连接调用超时,第二次出现套接字关闭异常。我也不知道为什么。据我所知,连接超时不应该关闭套接字。那么为什么说socket关闭了第二个循环呢?

我将一个套接字绑定到相同的本地IP地址和本地端口,但关闭该套接字。

任何帮助都将是非常感激的。

Socket mobileSocket2 = new Socket();
        try {
        System.out.println("105");
        mobileSocket2.setReuseAddress(true);
        System.out.println("109");
        mobileSocket2.setSoTimeout(50);
        mobileSocket2.bind(new InetSocketAddress(myIPAddress.getHostAddress(), myPort));
        System.out.println("bound");
        }
        catch (Exception e) {
            System.out.println("caught 104: " + e.toString());
        }


    while(true){
        Thread.sleep(5000);
        try{
                System.out.println("124");
                mobileSocket2.connect(new InetSocketAddress(mobileAddress.getHostAddress(), mobilePort));
                System.out.println("connection made: " + mobileSocket);

            }
            catch(Exception e){
                System.out.println("exception 2 caught " + e.toString());
            }
    }

您的代码无效。

  1. 您无法重新连接已连接的Socket.,当连接成功时需要添加break语句

  2. connect()失效时,不能重用Socket。你必须关闭它并创建一个新的

要么在捕获到第一个异常时重新打开套接字,要么将超时设置为0,javadoc说它被解释为'无限'。我没有看Socket和SocketImpl代码,但我相当有信心,因为Socket是一个可关闭的(也是一个AutoCloseable),实现是沿着

的行。
public void connect(InetAddress address, int port) throws IOException {
   try {
      // connect to the other endpoint
   } catch(/*any relevant exception*/) {
      throw new IOException(/* ... */);
   } finally {
      this.close();
   }
}

最新更新