Java-java socket inputstream 读取阻塞 的问题
我的思路是:用Socket监听本地一个端口,然后把浏览器的代理设置为那个端口。
这样当在浏览器中访问一个网站时,它会把http请求发到我监听的那个端口,并会为此创建一个新的Socket连接soc1,然后通过读取soc1的inputStream得到请求的地址等信息,然后创建一个新socket soc2,把soc1接收的http请求写入soc2的outputStream,然后再读取soc2的InputStream写入soc1的OutputStream。
问题:我读取soc1的inputStream时由于循环读取而没有返回-1导致它阻塞在那里了,这样导致我写入soc2的outputStream的操作不能执行。请问怎样才能解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这里没有返回-1的原因应该是http协议使用了 Connection: Keep-Alive, 产生了长连接, 这样就循环读取就不会返回-1, 我们需要自己判断什么时候数据接收完毕, 我也问过类似的问题:
关于http长连接的问题
1,socket的inputstream就是这个样子,永远阻塞在那里,只有来数据的时候,它在进行下一步操作.所以java才有了nio.
2,根据你的描述,真心觉得你的socket1与socket2够忙活的.你可能是想交换或者中介传到数据吧.如果不是,你可以听我说什么了
3,交换数据是要有缓冲区的,通常为阻塞队列,或者其他池类结构.你不能把数据直接从一个地方拿来然后再给另一个地方,你需要建立自己的缓存,把得到的数据与要发送的数据交给缓存处理.
4,找单独一个线程,或者利用锁机制来管理这个缓存区,保证数据的交换或者传到.你会立刻觉得结构好看了很多.io阻塞也变得非常可爱而且有意义.
采用多线程的方式。
使用java thread为每一个connection单独起一个线程,这样就可以了。
可以再考虑在程序里增加一个timeout的设置。
超时若干时间之后,不管返回什么,强行结束 connection。
你的这个应用是类似代理服务器的需求。
对于如何设计高性能的proxy应用,针对不同的平台,已经有了很多成熟的模式
譬如线程池,,高并发下考虑I/O completion port,异步I/O等
大流量下考虑各种cache技术。。。