2012-06-13 3 views
1

Я новичок в сетевом программировании. Мне интересно, можно ли установить сетевое соединение через сокеты между сервером Java и клиентом C и поддерживать связь неограниченно? Я хочу сохранить соединение открытым для обмена данными XML между клиентами.Можно ли открывать открытые сокеты неограниченное время

+8

* «Держите соединение открытым бесконечно?» * К сожалению нет. Всего за несколько сотен миллионов лет Земля испарится. –

+1

Нет, в конце концов, вселенная закончится :-) На более практичной ноте, через некоторое время, соединение, вероятно, упадет и должно быть восстановлено из-за проблемы с сетью. –

+1

Может быть, вы имеете в виду «стойкие», а не «бесконечные»? «Бесконечный» выводит циничную сторону в Stackoverflow. : P – kevin628

ответ

4

Теоретически возможно, чтобы серверные сокеты открывались бесконечно долгое время; однако это невозможно сделать с клиентским сокетом. Основная причина заключается в том, что сокет клиентской стороны зависит от сокета на стороне сервера, обрабатывающего данные, а серверный сокет может закрыть соединение.

В то время как возможно поддерживать связь неограниченно, практические аспекты обычно гарантируют, что такие сокеты не останутся открытыми навсегда. Сетевые сбои, неправильная конфигурация в промежуточных маршрутизаторах, исчерпание полосы пропускания, отсутствие вычислительной мощности и т. Д. Все сгруппированы, чтобы гарантировать, что соединения точка-точка в лучшем случае временные.

Обратите внимание, что сокет на стороне сервера является сокетом, который получает запросы на соединение (отбрасывая соединения, имеющие свои собственные сокеты), поэтому он может быть открыт, даже если нет подключений. Если вы считаете, что сокет является открытым подключением к другому компьютеру, вам необходимо переориентировать свое мышление, чтобы иметь смысл иметь серверные сокеты.

+2

И не забудьте обработать эти досадные «EarthVaporizedException» и «UniverseHasEndedException», указанные выше. –

+1

@LucaGeretti Такой комментарий - это весело, но на самом деле вы просто избегаете ответа на вопрос. Stackoverflow не _meant_ быть скучным, но ответы, которые включают тепловую смерть Вселенной, просто не полезны в не универсальной шкале времени. –

+0

Проблема, описанная в первом абзаце, не ограничивается клиентским сокетом. Он симметричен. Любая из сторон может отказаться от соединения, и поэтому может быть любой промежуточный узел. – EJP

2

Ничто не является бесконечным (при вычислении), но вы можете сохранить соединение сокета открытым до тех пор, пока выполняются оба приложения.

2

Это скорее мольба, чем ответ, но, как пользователь, я обнаружил, что сокеты постоянно падают. Вы не можете держать их открытыми неопределенно. Когда гнездо неожиданно закрывается, пожалуйста, (A) сообщите пользователю о том, что соединение было сброшено, и (B) сделать это real легко восстановить такое же соединение. Хорошо, это касается игр, но у меня были клиенты, которые не признали бы, что сервер ушел, и серверы, которые не узнали бы меня, были тем же человеком, что и с отключенным соединением.

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