java.net.Socket.connect超时的准确性是多少?

时间:2012-01-27 14:02:09

标签: java sockets

我想知道方法java.net.Socket.connect(SocketAddress, int timeout)的超时准确度是多少?

最初我认为它是在java.lang.Object.wait之上构建的,因此有一个10-15毫秒的错误(source),

但是在检查了源代码之后,看起来所做的就是将调用委托给java.net.SocketImpl.connect(SocketaAddress, int)

这是否意味着java.net.Socket.connect(SocketAddress,int)不使用Object.wait,因此不受10-15毫秒错误的影响Object.wait有?

2 个答案:

答案 0 :(得分:2)

首先,我希望套接字连接超时由OS /内核直接处理。 C套接字API支持连接超时,所以我希望JVM本机实现只是委托给它。

其次,为什么要关注网络连接上10-15ms的准确度?听起来你最终会变得非常脆弱。

答案 1 :(得分:1)

  

看起来它所做的就是将调用委托给java.net.SocketImpl.connect(SocketaAddress,int)。

这是SocketImpl类的抽象方法。

实际实现它的子类(在SocketImpl构造函数中从SocketImplFactory.createSocketImpl()隐式检索的系统默认Socket)依次依赖于本机方法,所以不可能知道与平台无关的不准确。

- 编辑(回复评论)

如果没有使用通过受保护的Socket构造函数指定自定义SocketImpl的{​​{1}}子类,则由Socket(SocketImpl impl)构造函数创建的标准Socket实例使用一个Socket()(反过来扩展SocksSocketImpl)。

PlainSocketImpl

呼叫

SocksSocketImpl.connect(SocketAddress address, int timeout)super.connect(SocketAddress address, int timeout)),

反过来调用

PlainSocketImpl.connect(SocketAddress address, int timeout)

反过来调用

PlainSocketImpl.connectToAddress(InetAddress address, int port, int timeout)

反过来调用

PlainSocketImpl.doConnect(InetAddress address, int port, int timeout)

这是一个私有的原生方法,我们不知道里面是什么:)

所以不,我们依赖于PlainSocketImpl.socketConnect(InetAddress address, int port, int timeout)

-

有关源代码

,请参阅http://jcs.mobile-utopia.com/jcs/18846_PlainSocketImpl.javahttp://jcs.mobile-utopia.com/jcs/31401_SocksSocketImpl.java