2012-01-27 2 views
1

Мне было интересно, что такое тайм-аут метода java.net.Socket.connect(SocketAddress, int timeout)?Какова точность тайм-аутов java.net.Socket.connect?

Первоначально я думал, что он построен на вершине 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 имеет?

ответ

1

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

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

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

- EDIT (ответ на комментарий)

Если не используется 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),

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

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

-

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

+0

Я не мог просматривать источник после SocketImpl. У вас есть исходный код реализации? – Pacerier

+0

Я полностью отредактировал свой оригинальный ответ в ответ на ваш комментарий. Пожалуйста, посмотрите –

2

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

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

+0

Нет Мне было интересно, если java.net.Socket.connect использует временную шкалу, основанный на Object.wait или несколько * внутренних * функций. – Pacerier

+0

@Pacerier Ответ на вопрос «Зачем вам ...?» вероятно, поможет респондентам дать вам ответ, который вы ищете. Вам также нужно будет определить «внутренний». Делегирование в реализацию сокета на родной ОС - это то, что я считаю «внутренним». – Dev

Смежные вопросы