我想知道方法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有?
答案 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.java和http://jcs.mobile-utopia.com/jcs/31401_SocksSocketImpl.java