Проблема получения видеоданных с сервера только в плагине браузера - PullRequest
0 голосов
/ 29 мая 2009

У меня проблема с сервером, написанным на Java, работающим на Tomcat, обслуживающим видеофайлы. Я не писал код и очень мало знаком с библиотеками, занимающимися этой проблемой, поэтому любые идеи, которые можно использовать, будут высоко оценены:)

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

Однако, когда вы пытаетесь просмотреть один с помощью плагина для воспроизведения видео (кажется, не имеет значения, какой плагин ... WMP для FF или IE, VLC в FF, не имеет значения, какая версия браузера также) все идет не так. Похоже, что со стороны браузера никакие данные не доходят до плагина (поэтому плагин VLC, например, просто говорит «ожидает видео» ... он никогда не приходит).

На стороне сервера есть экземпляр HttpServletResponse, он вызывает для него getOutputStream, без проблем записывает данные в поток, а затем при закрытии потока выдается исключение.

Трассировка стека исключений выглядит следующим образом:

java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:750)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)

Есть идеи? :)

Ответы [ 3 ]

0 голосов
/ 29 мая 2009

Содержит ли заголовок ответа HTTP поле Content-Disposition? Если это так, попробуйте удалить его, чтобы позволить клиенту выбрать метод представления.

Спецификация: RFC 2183 .

0 голосов
/ 05 июня 2009

Хорошо, так что я наконец дошел до сути. Это на самом деле не имеет ничего общего с Tomcat или Java, главное - разница между тем, как браузер извлекает данные, и тем, как плагин браузера их извлекает: плагин не отправляет куки браузера.

В этом случае на сервере было несколько файлов cookie для входа в систему, поэтому запрос плагина на данные был отклонен до того, как он был записан в поток. Что сбивало с толку, так это то, что в отладчике код записи потока все еще выполнялся, но это было только потому, что браузер сначала запрашивает данные (как только он понимает, что у него есть видео, вместо этого запускается плагин, и плагин свежий HTTP-запрос).

Я обнаружил это с помощью Wireshark, где ответ на плагин был четким (это была HTML-страница типа «отказано в доступе»).

0 голосов
/ 29 мая 2009

Вы пытались смыть поток перед тем, как закрыть его? Как правило, вы не должны закрывать OutputStream ответа самостоятельно, контейнер сервлета сделает это как последнее, прежде чем завершит запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...