Java-java socket inputstream 读取阻塞 的问题

发布于 2016-10-19 14:09:51 字数 338 浏览 1579 评论 3

我的思路是:用Socket监听本地一个端口,然后把浏览器的代理设置为那个端口。
这样当在浏览器中访问一个网站时,它会把http请求发到我监听的那个端口,并会为此创建一个新的Socket连接soc1,然后通过读取soc1的inputStream得到请求的地址等信息,然后创建一个新socket soc2,把soc1接收的http请求写入soc2的outputStream,然后再读取soc2的InputStream写入soc1的OutputStream。

问题:我读取soc1的inputStream时由于循环读取而没有返回-1导致它阻塞在那里了,这样导致我写入soc2的outputStream的操作不能执行。请问怎样才能解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-07-05 04:31:31

这里没有返回-1的原因应该是http协议使用了 Connection: Keep-Alive, 产生了长连接, 这样就循环读取就不会返回-1, 我们需要自己判断什么时候数据接收完毕, 我也问过类似的问题:
关于http长连接的问题

灵芸 2017-04-09 06:03:35

1,socket的inputstream就是这个样子,永远阻塞在那里,只有来数据的时候,它在进行下一步操作.所以java才有了nio.

2,根据你的描述,真心觉得你的socket1与socket2够忙活的.你可能是想交换或者中介传到数据吧.如果不是,你可以听我说什么了

3,交换数据是要有缓冲区的,通常为阻塞队列,或者其他池类结构.你不能把数据直接从一个地方拿来然后再给另一个地方,你需要建立自己的缓存,把得到的数据与要发送的数据交给缓存处理.

4,找单独一个线程,或者利用锁机制来管理这个缓存区,保证数据的交换或者传到.你会立刻觉得结构好看了很多.io阻塞也变得非常可爱而且有意义.

浮生未歇 2017-01-18 17:25:14

采用多线程的方式。
使用java thread为每一个connection单独起一个线程,这样就可以了。

可以再考虑在程序里增加一个timeout的设置。

超时若干时间之后,不管返回什么,强行结束 connection。

你的这个应用是类似代理服务器的需求。

对于如何设计高性能的proxy应用,针对不同的平台,已经有了很多成熟的模式

譬如线程池,,高并发下考虑I/O completion port,异步I/O等

大流量下考虑各种cache技术。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文