Какова точность таймаутов java.net.Socket.connect? - PullRequest
1 голос
/ 27 января 2012

Мне было интересно, какова точность тайм-аута метода 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 ]

2 голосов
/ 27 января 2012

Во-первых, я ожидал бы, что тайм-аут соединения с сокетом обрабатывается непосредственно ОС / ядром. API сокета C поддерживает тайм-ауты подключения, поэтому я ожидаю, что собственная реализация JVM просто делегирует его.

Во-вторых, почему вы заботитесь о точности 10-15 мс в сети? Похоже, у вас получится что-то очень хрупкое.

1 голос
/ 27 января 2012

похоже, что все, что он делает - это делегирует вызов java.net.SocketImpl.connect (SocketaAddress, int).

, который является абстрактным методом класса SocketImpl.

Подкласс, фактически реализующий его (системное значение по умолчанию SocketImpl, неявно полученное из SocketImplFactory.createSocketImpl() в конструкторе Socket), в свою очередь, опирается на собственный метод, поэтому невозможно узнать неточность в независящей от платформы платформе. способ.

- РЕДАКТИРОВАТЬ (ответ на комментарий)

Если не использовать подкласс Socket, который задает пользовательский SocketImpl через защищенный конструктор 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)

, который является частным нативным методом, и мы не знаем, что внутри:)

Так что нет, мы не полагаемся на Object.wait.

-

См. http://jcs.mobile -utopia.com / jcs / 18846_PlainSocketImpl.java и http://jcs.mobile -utopia.com / jcs / 31401_SocksSocketImpl.java для исходного кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...