Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Threads in Java
Посл.ответ Сообщение

Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 16:36
· Личное сообщение · #1

Привет всем.

Пишу многопоточный прокси-сервер на Java. Вроде бы все нормально работает. Но иногда при открытии странички запрос уходит совершенно не на тот сайт. В результате либо 404 Not Found, либо еще хуже. У меня в программе три потока. Первый - MainThread - слушает подключения и при подключении клиента создает поток ClientThread, который принимает запросы от клиента и перенаправляет их серверу, главный же поток дальше слушает... ClientThread создает поток ServerThread, который читает с сервера ответы и перенаправляет их клиенту. В принципе обычная асинхронная схема. Но откуда растут ноги у бага, я уже замучился искать. Например, если зайти на сайт www.miranda-im.org, затем в раздел Downloads и выбрать Alternate downloads, и далее попытаться скачать файл уже с sourceforge.net, то нифига не скачается. Без прокси все отлично.

Может быть я что-то не так делаю? )))))

497e_14.05.2008_CRACKLAB.rU.tgz - proxy.java

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 14 мая 2008 17:13 · Поправил: arnix
· Личное сообщение · #2

Первое что бросилось в глаза это:

while((bytesRead = streamFromServer.read(buf)) != -1)

А ты уверен что буффер у тебя достаточно большой? Попробуй так:

while((bytesRead = streamFromServer.read(buf, 0, 4096)) != -1)


Добавлено:
нет (

The read(b) method for class InputStream has the same effect as:
read(b, 0, b.length)


Оказывается Java умная



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 17:31
· Личное сообщение · #3

Проблема проявляется при коннекте к серверу. Такое впечатление, что путаются треды (нонсенс)... Либо сокеты (уже не нонсенс)... И запрос от клиента идет не на тот хост. Странно все как-то.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 17:41
· Личное сообщение · #4

Я сначала грешил на dns resolve в Java. написал метод, который резолвил доменное имя в ip-адрес используя системную команду ping (вырезает из квадратных скобок адрес) ))) но, оказалось, не в этом проблема

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 14 мая 2008 17:51
· Личное сообщение · #5

Нужно брать дебаггер в руки и вперед или прикрутить к программе logging. Ночью будет время попробую потестировать (если удастся найти ошибку отпишись чтоб зря не старался ;) )



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 18:03
· Личное сообщение · #6

arnix
Когда на C++ пишу, ессно юзаю дебаггер... А когда на Java - у меня его просто нет Чем вообще отлаживать Java-приложения? ))

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 14 мая 2008 20:00
· Личное сообщение · #7

Tim пишет:
Я сначала грешил на dns resolve в Java. написал метод, который резолвил доменное имя в ip-адрес используя системную команду ping (вырезает из квадратных скобок адрес) ))) но, оказалось, не в этом проблема

гагага, InetAddress.getByName("cracklab.ru") заменить пингом?

Tim пишет:
Чем вообще отлаживать Java-приложения? ))

Eclipse или другая IDE



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 22:31
· Личное сообщение · #8

Вот версия с выводом exception'ов и небольшим количеством логов.
Запускать так:
java Proxy 8080 127.0.0.1 -verbose

6b0c_14.05.2008_CRACKLAB.rU.tgz - proxy.java

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 22:36
· Личное сообщение · #9

Сейчас заметил интересную вещь! Если через прокси открыть ЭТУ страницу, и потом выйти в список форумов, то для этой страницы напишет Connection from, а для списка форумов - не напишет... Получается он по тому же открытому сокету ломится... Как это вообще возможно?

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 14 мая 2008 23:04
· Личное сообщение · #10

До меня дошло!
Браузер за один сеанс связи с прокси-сервером может посылать несколько запросов, причем на разные хосты. Отсюда и ругательство серверов. Я вот сейчас думаю, что лучше сделать - проверять в запросе поле Content-Length и читать исходя из этого, и потом закрывать соединение, либо реализовать несколько запросов за сеанс...

Посмотрел на свой топик, прикололся - отвечал себе сам ) Наверное поэтому многие люди ведут блоги... Думается легче ))))

-----
MicroSoft? Is it some kind of a toilet paper?





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 мая 2008 00:55
· Личное сообщение · #11

Tim пишет:
Посмотрел на свой топик, прикололся - отвечал себе сам

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



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 18 мая 2008 17:04
· Личное сообщение · #12

В общем, нужна снова помощь

Дописал я свой прокси до более менее законченного вида. Научил keep-alive соединениям, pipelining'у. Все замечательно работает ))) Но почему-то, иногда браузер как бы подвисает на 100% при открытии страницы. Это касается только keep-alive соединений. С close все просто отлично. Например, если зайти на страницу gismeteo.ru, и там открыть прогноз, и пообновлять, может получиться так, что страница не догрузится... индикатор загрузки на 100% замрет. В Firefox так... и в IE так же.
Кто-нибудь, гляньте, а то замучился уже искать баг )

57ca_18.05.2008_CRACKLAB.rU.tgz - proxy.java

-----
MicroSoft? Is it some kind of a toilet paper?





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 19 мая 2008 19:52
· Личное сообщение · #13

Tim, так а что твой код в момент зависона делает? Воткни logging если у тебя ещё не ведётся.


 eXeL@B —› Программирование —› Threads in Java
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати