2013-11-21 153 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()(從服務器)和write(到瀏覽器)循環的字節位於try-catch塊中,所以如果失敗了,套接字就會關閉。

一切工作正常,但問題發生在這裏:當瀏覽器請求轉發視頻,即到視頻的第5分鐘(使用字節範圍標題),我的服務器停止工作。 write()失敗,套接字關閉。接受的下一個套接字無法寫入(或可以),但瀏覽器請求失敗(在Chrome開發人員工具中查看時)。

對不起,我希望你能幫助我。如果有必要,我可以發佈一些代碼,但它是一個基本的多線程套接字服務器,每個套接字都有一個線程。

只是爲了澄清,通過轉發視頻我的意思是快進和/或倒帶。瀏覽器使用字節範圍標頭來執行此操作。

+0

這是一個超時的事情?你能否告訴'write()'在特定的時間之後是否正在死亡? – admdrew

+0

瀏覽器請求轉發視頻後,它幾乎立即死亡。 – liliumdev

+0

我想在接受新套接字後添加一個'sleep()'幾秒鐘,但是這也不起作用。 – liliumdev

回答

0

原來問題出在閃存視頻播放器上,請求來自服務器的視頻標頭錯誤。調整它的屬性後(談論jwplayer),它工作正常。