Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокси сервер, Теряются передаваемые данные 
:(
    Опции темы
Andrey F.
Дата 28.11.2005, 10:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Доброго времени суток!
Столкнулся со следующей проблемой при написании своего
"прокси сервера", в задачи которого входит приём соединения от клиента, написанного мною же и соединение с удалённым сервером некоторой базы данных. По сути, на прокси сервер пока
не возлогается больше никаких функций.
Так же необходимо обеспечить возможность подключения нескольких клиентов одновременно.
Поэтому, было принято решение реализовать его следующим образом:
при подключении нового клиента, устанавливается новое соединение как с ним так и с
сервером, для нового клиента сервер БД выделяет новый порт; и создается два потока
(threads) один постоянно читает с сервера и передаёт всё, что прочитал клиенту, а второй
так же передаёт данные от клиента к серверу. Возникла следующая проблема: не всегда
получается прочитать то, что приходит с удалённого сервера БД, хотя запрос всегда остаётся
неизменным, а данные от сервера приходят на машину с прокси, если верить SnifMon'у.
Получается так: может придти, а может и нет.
Запускал на машине друга --- работает всегда. Возможно нужна какая то синхронизация? Но
где, если оба потока читают и записывают в разные места?
Приведу код классов, реализующих потоки:
Код

class DataTransferThread extends Thread{
        private final Socket socket;
        private final Socket neighbor;
        private final InputStream inStream;
        private final OutputStream outStream;
        private final byte[] buffer = new byte[256 << 10];
 
        DataTransferThread(String name, Socket socket,
                           OutputStream outStream,
                           Long rwTime, Socket neighbor)
                throws IOException{
            super(name);
            this.socket = socket;
            inStream = socket.getInputStream();
            this.outStream = outStream;
            this.neighbor = neighbor;
        }
 
        public void run(){
            while(!socket.isClosed()){
                try{
                    int read;
                    read = inStream.read(buffer, 0, buffer.length);
                    if(read != 0){
                        outStream.write(buffer, 0, read);
                        outStream.flush();
                    }
                } catch(IOException e){
                    ....
                }
            }
        }
    }
 

Подскажите, пожалуйста, возможные варианты решения проблемы!

Заранее благодарен.


  Вверх
Andyb
Дата 13.12.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 1
Всего: 5



Проверь может файрволл рубит или антивирус( в версии java 1.5 и выше у меня лично возникали проблемы с Nod32 при использовании сокетов)
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
vinegr
Дата 10.2.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.2.2006

Репутация: 1
Всего: 3



насколько могу судить по вашему коду, вы пытаетесь запустить два экземпляра одного и того же класса "навстречу друг-другу".
если это так, то вы напарываетесь на неготовность одного из стримов к моменту, когда он понадобится (т.е. если удалось соединиться - дальше все работает нормально, но соединиться удается не всегда smile ).

тогда кроме пары симметричных "встречных" прокси-нитей нужна "клиентская" нить, которая создаст все 4 стрима - а потом можно либо запускать пару прокси-нитей и ждать их завершения, либо (что правильнее) запустить одну нить-"перекладывалку из сокета в сокет", а навстречу перекладывать в методе Run самой клиентской нити.
PM MAIL   Вверх
COVD
Дата 11.2.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата(Andrey F. @ 28.11.2005, 10:13 Найти цитируемый пост)
при подключении нового клиента, устанавливается новое соединение как с ним так и с
сервером, для нового клиента сервер БД выделяет новый порт; и создается два потока
(threads) один постоянно читает с сервера и передаёт всё, что прочитал клиенту, а второй
так же передаёт данные от клиента к серверу.


А зачем надо два потока? База данных по своей инициативе обычно ничего никому не посылает, она только отвечает на запросы. Значит должен быть один поток, который читает запрос от клиента и пересылает его базе данных, потом читает ответ базы данных и пересылает его клиенту. Затем ждет нового запроса клиента.

PM MAIL   Вверх
AndreyF
Дата 17.2.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.11.2005

Репутация: нет
Всего: нет



В данном случае БД весьма активна. Она полностью управляет процессом запущенным у клиента.
БД --- Cache post-relational database
PM MAIL   Вверх
COVD
Дата 17.2.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Схему с двумя встречными потоками информации сложно контролировать, если данные передаются через интернет. Мы отказались от нее в пользу "запрос - ответ". Так легче определить, какая порция данных уже получена клиентом в случае обрыва соединения. Кроме того, это единственная схема передачи информации , если клиент вынужден соединяться по http.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.