2013-11-21 3 views
0

Мой прокси-сервер - это простой Java-сервер сокетов, который прослушивает порт 8081. Однако запросы обрабатываются немного иначе, чем обычный прокси-сервер.Сброс соединения прокси-сервера

Например, если я хочу открыть http://www.google.com, я бы набрал http://localhost:8081/http://www.google.com. Мой сервер: 8081 откроет сокет на http://www.google.com:80, отправит те же HTTP-заголовки, которые он получил от браузера, а затем вернет ответ от Google в браузер.

Но, если, например, браузер ожидает поток видео/mp4, возникает проблема. Произнесите запрошенную страницу: http://localhost:8081/http://www.cnn.com/today.mp4. Мой сервер: 8081 затем подключится к http://www.cnn.com/today.mp4 с соответствующими заголовками и начнет получать поток. Поток будет прочитан, а фрагменты (а не фрагментированные http-кодировки, фрагменты 32768 байт) будут перенаправлены в браузер. Мой сервер создает отдельный поток для каждого сокета, а байтовый read() (от сервера) и цикл записи (в браузер) находится в блоке try-catch, поэтому, если что-то не получается, сокет просто закрывается.

Все работает нормально, но проблема возникает здесь: когда браузер запрашивает переслать видео, то есть на 5-ю минуту видео (используя заголовок диапазона байтов), мой сервер перестает работать. write() не работает, и сокет закрыт. Следующий принятый сокет не может быть записан (или может), но запрос браузера не удается (при просмотре в Инструментах разработчика Chrome).

Извините за текст стены, надеюсь, вы могли бы мне помочь. В случае необходимости я могу опубликовать некоторый код, но это базовый многопоточный сервер сокетов с потоком на один сокет.

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

+0

Это таймаут? Можете ли вы сказать, умирает ли 'write()' через определенное количество времени? – admdrew

+0

Он умирает почти сразу после того, как браузер запрашивает переслать видео. – liliumdev

+0

Я подумал о добавлении 'sleep()' в течение нескольких секунд после принятия нового сокета, но это тоже не сработало. – liliumdev

ответ

0

Оказывается, проблема была в проигрывателе флэш-видео, запрашивающего видео с сервера с неправильными заголовками. После настройки его свойств (говоря о jwplayer), он отлично работает.

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