2013-05-25 2 views
0

Я пытаюсь создать клиент-серверную программу на Java. На самом деле клиенты могут связаться с моим сервером, поскольку для моего маршрутизатора настроен переадресация на порт 7777. Поэтому я получаю их сообщения в порядке. Как только я получаю сообщение от клиента, я держу объект сокета открытым (я не закрываю поток ввода или вывода), а затем пытаюсь отправить сообщение обратно. Я вообще не получаю никаких исключений, поэтому я уверен, что сообщение доставляется на IP-адрес сокета, я даже попытался отправить и ответить на свой собственный серверный компьютер, и он отлично работает. Итак, что происходит, так это то, что, сохраняя сокет, я действительно знаю IP-адрес от клиента, и сообщение попадает на маршрутизатор клиента. Я думаю, что это не происходит, так это то, что маршрутизатор не доставляет сообщение этому клиенту, так как он не должен его знать. Я сейчас потерялся, теперь меня сводит с ума. СпасибоНе удается ответить на не локальный сокет в Java

+1

Показать код. Или еще лучше, только соответствующие части кода. –

+0

Как вы это тестируете? Telnet на ваш сервер? –

+0

Я бы посоветовал 'ping' как серверу, так и клиенту посмотреть, доступны ли они с обоих концов. –

ответ

0

Возможно, сервер закрывает сокет, и вы не подключены. В java есть разные методы, чтобы проверить это, мало работ и немногих нет. Вот подробности о том, что вы должны сделать, чтобы проверить, подключен ли клиент или нет:.

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

socket.isConnected() возвращает всегда верно, как только клиент подключается (и даже после отключения) странно !!

out.checkError() верно, как только клиент отключен

Единственный способ действительно узнать, читая (вы получите -1 в качестве возврата значение) или письменной форме (IOException (сломанный трубопровод) будет сброшен) на связанных с входом/выходом потоках .

Как только вы уверены, что вы подключены к серверу, вам нужно только перейти, чтобы узнать, что-то не так с маршрутизатором или сетью.

Надеюсь, это поможет!

+1

' Socket.isConnected() 'сообщает вам, * * вы когда-либо подключали' Socket'. Он ничего не говорит о текущем состоянии * соединения. * 'Out.checkError()' возвращает true * после того, как * при записи было 'IOException', потому что' PrintStream' и 'PrintWriter' подавляют исключения, что является хорошей причиной не использовать их по сети. Он не * * * становится правдой, как только клиент отключился. Чтение также может вызывать 'IOException', а не возвращать -1, если соединение было прервано. Слишком много ошибок здесь. -1 – EJP

+0

@EJP FYI Socket.isConnected не работает. Вы можете попробовать это для себя. checkError() Сбрасывает поток и проверяет его состояние ошибки, и, следовательно, возвращает true, если отключен. –

+0

@JunedAhsan - Мы это знаем! Если вы хотите понять, почему, прочитайте javadoc. Нет ничего «странного» в отношении метода, который ведет себя точно так, как указано для его поведения.Единственное «странное» дело в том, что вы не удосужились прочитать javadoc в первую очередь :-) –

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