本站消息

站长简介


前每日优鲜python全栈开发工程师,自媒体达人,逗比程序猿,钱少话少特宅,我的公众号:想吃麻辣香锅

  java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

从HTTP服务器中的套接字读取的推荐方法

发布于2021-05-18 21:52     阅读(1017)     评论(0)     点赞(3)     收藏(0)


0

1

2

3

4

5

6

7

8

9

作为一个挑战,我已经用Java实现了一个基本的Web服务器。当我打开原始文件时,InputStream我立即进入阻塞读取,该读取将HTTP请求的整个400或字节读入一个字节数组。这行得通,但是我然后不检查更多数据,而只是在发送响应后关闭套接字。

我想知道是否有更健壮的方法来执行此操作,以免丢失来自客户端的任何数据。我想一次读取一个字节,直到read返回流的结尾。但是,当没有更多数据时,它有时会阻塞,而JavaDocs对此却感到困惑public abtract int InputStream.read()

If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

因此,这意味着如果到达流的末尾,可能会发生两件事:返回-1和阻塞。我看到了障碍。

我的问题是,使用HTTP之类的协议,您应该如何从套接字读取数据,以及如何知道何时从该连接中获取所有数据?


解决方案


您引用的JavaDoc并不意味着如果到达流的末尾,可能会发生两件事。检测到流的末尾,并没有说读取块,而是直到检测到流的末尾。一旦检测到,将返回-1。

这就解释了您正在观察的行为:没有检测到流的末尾并且阻止了读取。一旦关闭连接,就检测到流的结束,但是由于客户端在发送请求后不会立即关闭连接,因此未关闭流。它必须保持打开状态才能收到回复。

为了确保您从客户端收到所有数据,您应该解析其HTTP请求,直到看到标头的末尾(双换行符)以及标头中指定的任何数据量(如果有)。

如果您想避免阻塞,请查看java.nio渠道SocketChannel尤其是)。


站长简介:前每日优鲜python全栈开发工程师,自媒体达人,逗比程序猿,钱少话少特宅,关注我,做朋友, 我们一起谈人生和理想吧!我的公众号:想吃麻辣香锅

关注公众号回复java,免费领取 免费领取java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

关注公众号回复java充值+你的账号,免费为您充值1000积分

0

1

2

3

4

5

6

7



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/189959/0e30b7642cbfd9c24c50/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)