这让我疯了!
我正在尝试实施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());
}
}
答案 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)
您的代码无效。
您无法重新连接已连接的Socket.
当连接成功时,您需要添加break
语句。
Socket
失败时,您无法重复使用connect()
。你必须关闭它并创建一个新的。