|
Модераторы: LSD, AntonSaburov |
|
enzaime |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
Всем привет, решил создать простенькое взаимодействие клиент/сервер и столкнулся с проблемой потери связи, в чём проблема не пойму(ошибка connection reset) Вот код:
Сервер
Клиент
|
||||||||
|
|||||||||
Pawl |
|
||||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
вот сдесь
надо бы добавить
-------------------- В действительности всё совсем не так, как на самом деле |
||||
|
|||||
enzaime |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
да точно забыл я про это, но всё равно проблема остается.
|
|||
|
||||
Pawl |
|
||||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
не делайте запрос от клиента многопоточным - нет смысла, т. к. клиент все-равно шлет запросы по очереди, а не одновременно. Вот рабочий вариант клиента:
Если все-же делать многопоточным, надо в каждом потоке создавать свой сокет. Это сообщение отредактировал(а) Pawl - 15.3.2014, 21:36 -------------------- В действительности всё совсем не так, как на самом деле |
||||
|
|||||
enzaime |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
Pawl у меня к вам такой вот вопрос, насчёт s.close(), получается, что будет отослано 1 сообщение и соединение закроется. Вопрос такой: при посылке следующего сообщения от того же клиента надо заново соединяться к серверу? И можно ли как-то не разрывать это соединение, а держать постоянно, для постоянного обмена сообщениями?
|
|||
|
||||
Pawl |
|
|||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
Можно организовать бесконечный цикл, как в этом или этом примерах. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
enzaime |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
Я вот тут написал, но как-то не понимаю в чём причина (проблема в классе ThreadKlient)
первый раз нормально от сервера приходит ответ, второй раз null, а на сервере 1 раз приходит ответ от клиента сервер
класс клиента на сервере
|
||||||||
|
|||||||||
Pawl |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
Попробуйте каждый раз отправлять запрос с нового сокета:
-------------------- В действительности всё совсем не так, как на самом деле |
||||||
|
|||||||
enzaime |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
Я тоже об этом думал, но тогда как-то неправильно выходит. Например, у Хорстмана есть пример в котором описан консольный сервер, который отсылает назад все сообщения от клиента (клиент: привет. сервер: ECHO привет). Там роль клиента исполняет программа telnet (входит в пакет windows). Там держится постоянное соединение, а если использовать каждый раз новый сокет, то получается, что 1 пользователь регистрируется на сервере n-ое количество раз. Т.е. это всё равно что после каждого сообщения на форуме проходить авторизацию ( ну это я так это вижу, но всё-таки мне кажется, что для каждого клиента нужно использовать 1 пару сокетов (1 сокет у клиента, 2 у сервера)).
|
|||
|
||||
Pawl |
|
|||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
На самом деле, когда приходит запрос от клиента к серверу, тот всегда воспринимает его, как новый. Сервер ничего не знает о предыдущих запросах. Принцип работы тут такой: сервер "слушает" какой-то порт, запрос от клиента инициирует открытие соединения. Сервер отвечает, после чего инициирует закрытие, и "забывает" об этом. Т. е. от клиента закрытие соединения не зависит. Хочешь соединиться снова - открывай новое соединение. Что же до авторизаций на форуме и пр., тут есть еще понятие сессии, это уже несколько из другой оперы, и скорее относится к web-программированию. Это сообщение отредактировал(а) Pawl - 16.3.2014, 11:27 -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
enzaime |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
Я таки разобрался в чём причина была. Соединение терялось так как была ошибка записывания/считывания потока BufferedReader/PrintWriter, из-за этого сокет на стороне клиента разрывал соединение (скорее всего ошибка была связана с освобождением ресурсов потоков или как-то так (если например записать/считать потоки а потом применить метод сокета close(), то всё норм, следовательно в close() правильно обращается с потоками в отличие от меня)).Вот рабочий вариант, если кому интересно.
Сервер
Клиент (написанный с использованием Swing и SWT(SWT для Eclipse(нужно подключить библиотеку org.eclipse.swt))
Осталось добавить историю сообщений. Спасибо всем, кто пытался помочь. |
||||||||||
|
|||||||||||
Pawl |
|
|||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
В этом случае также для каждого соединения в клиенте создается новый сокет - всякий раз, когда нажимается кнопка "соединение" и вызывается метод start(), происходит создание нового сокета:
Это сообщение отредактировал(а) Pawl - 16.3.2014, 19:23 -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
enzaime |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
В проге надо нажать 1 раз соединение и больше не надо (просто я не стал её блокировать). А так если нажать на соединение, потом отослать сообщение больше 1 раза, то оно (соединение) не разрывается, а держится постоянно.
|
|||
|
||||
Pawl |
|
|||
Опытный Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 1 Всего: 28 |
Я думал, вам надо организовать диалог клиент-сервер (типа вопрос-ответ), а не простую отправку сообщений серверу.
-------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
enzaime |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 16.8.2013 Репутация: нет Всего: нет |
В любом случае спасибо за помощь, я в итоге получил что хотел.
|
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |