【问题标题】:Proxy server connection reset代理服务器连接重置
【发布时间】: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


【解决方案1】:

原来问题出在 Flash 视频播放器向服务器请求视频时标头错误。调好它的属性(说到jwplayer)后,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多