![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Andrey F. |
|
|||
|
Unregistered |
Доброго времени суток!
Столкнулся со следующей проблемой при написании своего "прокси сервера", в задачи которого входит приём соединения от клиента, написанного мною же и соединение с удалённым сервером некоторой базы данных. По сути, на прокси сервер пока не возлогается больше никаких функций. Так же необходимо обеспечить возможность подключения нескольких клиентов одновременно. Поэтому, было принято решение реализовать его следующим образом: при подключении нового клиента, устанавливается новое соединение как с ним так и с сервером, для нового клиента сервер БД выделяет новый порт; и создается два потока (threads) один постоянно читает с сервера и передаёт всё, что прочитал клиенту, а второй так же передаёт данные от клиента к серверу. Возникла следующая проблема: не всегда получается прочитать то, что приходит с удалённого сервера БД, хотя запрос всегда остаётся неизменным, а данные от сервера приходят на машину с прокси, если верить SnifMon'у. Получается так: может придти, а может и нет. Запускал на машине друга --- работает всегда. Возможно нужна какая то синхронизация? Но где, если оба потока читают и записывают в разные места? Приведу код классов, реализующих потоки:
Подскажите, пожалуйста, возможные варианты решения проблемы! Заранее благодарен. |
|||
|
||||
| Andyb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 7.6.2004 Где: Lille, France Репутация: 1 Всего: 5 |
Проверь может файрволл рубит или антивирус( в версии java 1.5 и выше у меня лично возникали проблемы с Nod32 при использовании сокетов)
--------------------
Большинство наших ошибок происходит из-за невнимательности. |
|||
|
||||
| vinegr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 6.2.2006 Репутация: 1 Всего: 3 |
насколько могу судить по вашему коду, вы пытаетесь запустить два экземпляра одного и того же класса "навстречу друг-другу".
если это так, то вы напарываетесь на неготовность одного из стримов к моменту, когда он понадобится (т.е. если удалось соединиться - дальше все работает нормально, но соединиться удается не всегда тогда кроме пары симметричных "встречных" прокси-нитей нужна "клиентская" нить, которая создаст все 4 стрима - а потом можно либо запускать пару прокси-нитей и ждать их завершения, либо (что правильнее) запустить одну нить-"перекладывалку из сокета в сокет", а навстречу перекладывать в методе Run самой клиентской нити. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
А зачем надо два потока? База данных по своей инициативе обычно ничего никому не посылает, она только отвечает на запросы. Значит должен быть один поток, который читает запрос от клиента и пересылает его базе данных, потом читает ответ базы данных и пересылает его клиенту. Затем ждет нового запроса клиента. |
|||
|
||||
| AndreyF |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 28.11.2005 Репутация: нет Всего: нет |
В данном случае БД весьма активна. Она полностью управляет процессом запущенным у клиента.
БД --- Cache post-relational database |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Схему с двумя встречными потоками информации сложно контролировать, если данные передаются через интернет. Мы отказались от нее в пользу "запрос - ответ". Так легче определить, какая порция данных уже получена клиентом в случае обрыва соединения. Кроме того, это единственная схема передачи информации , если клиент вынужден соединяться по http.
|
|||
|
||||
![]()
|
| Правила форума "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. |