socket.connect超时后我的socket继续关闭

时间:2015-05-20 09:56:43

标签: java sockets

这让我疯了!

我正在尝试实施TCP打孔,作为其中的一部分,我有一个试图连续连接的套接字。

由于某种原因,在第一次mobileSocket2.connect调用超时后,第二次出现套接字关闭异常。我不知道为什么。据我所知,连接超时不应该关闭套接字。那么为什么说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());

            }

    }

2 个答案:

答案 0 :(得分:0)

在捕获第一个异常时重新打开套接字,或者将超时设置为0,javadoc将其解释为“无限”。我没有看过Socket和SocketImpl代码,但我相当自信,因为Socket是一个Closeable(也是一个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();
   }
}

答案 1 :(得分:0)

您的代码无效。

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

  2. Socket失败时,您无法重复使用connect()。你必须关闭它并创建一个新的。