【发布时间】:2013-11-26 00:15:15
【问题描述】:
我的代理服务器是一个简单的 Java 套接字服务器,它侦听端口 8081。但是,处理请求的方式与常规代理服务器略有不同。
例如,如果我想打开http://www.google.com,我会输入http://localhost:8081/http://www.google.com。我的 server:8081 会在 http://www.google.com:80 上打开一个套接字,发送从浏览器接收到的相同 HTTP 标头,然后它将来自 Google 的响应返回给浏览器。
但是,例如,如果浏览器期待视频/mp4 流,则存在问题。假设请求的页面是http://localhost:8081/http://www.cnn.com/today.mp4。然后,我的 server:8081 将使用适当的标头连接到 http://www.cnn.com/today.mp4 并开始接收流。将读取流并将块(实际上不是分块的 http 编码,32768 字节的块)转发到浏览器。我的服务器为每个套接字创建一个单独的线程,字节读取()(来自服务器)和写入(到浏览器)循环位于 try-catch 块中,因此如果出现故障,则简单地关闭套接字。
一切正常,但问题发生在这里:当浏览器请求转发视频时,即到视频的第 5 分钟(使用字节范围标头),我的服务器停止工作。 write() 失败并且套接字已关闭。下一个接受的套接字无法写入(或可以),但浏览器请求失败(在 Chrome 开发者工具中查看时)。
对不起,文字墙,我希望你能帮助我。如有必要,我可以发布一些代码,但它是一个基本的多线程套接字服务器,每个套接字都有一个线程。
澄清一下,转发视频是指快进和/或快退。浏览器使用字节范围标头来执行此操作。
【问题讨论】:
-
这是超时的事情吗?你能判断
write()是否在特定时间后死亡? -
在浏览器请求转发视频后,它几乎立即死亡。
-
我想在接受新套接字后添加一个
sleep()几秒钟,但这也没有用。 -
您是否尝试过使用wireshark 或fiddler 来查看远程网络服务器究竟返回了什么?这可能是我的下一个故障排除步骤。
-
我一到我的工作站就试一试。如果我偶然发现任何帮助,会通知您。
标签: java multithreading sockets proxy