首页>技术文章>Java+Socket编程读取输入流时需要注意的几个细节(原创)

采用Java进行Socket编程时,对于输入流InputStream的处理时有几个细节必须注意:

一、3个要注意的基本细节:
1.TCP中的in.read()读到-1仅表示当前缓冲区里无数据,并非之后一直会无数据,等待一段时间之后可能会再有数据。
available()也一样没有效果,如果available()的返回值为0只表示当前缓冲区中无数据,也不能作为读完数据的标志。

2.in.read(byte[])、in.read(byte b[],int off, int len)均是调用in.read(),因此使用in.read()效率一样。
3.在读输入流时,如果读到一部分还未读完就进行调试,有可能会丢掉一些输入的字节,如果连续的读则不会丢失,时间过长还会使得输入流失效。

二、2个读取HTTP包的细节:
1.在HTTP中读取服务端的数据时,判断是否已经结尾,是要先看包头,如果包头中有包体的长度(即指定了Content-Length)则读到该长度后即可算作结束,可断开连接。
如果未指定包体长度,则应该是用了chunked方式:Transfer-Encoding: chunked,即包体分块,每块的开头处为长度,则要一段段的读取。对于无包体的情况,也会在包体中加入一个\r\n0\r\n
因此读取HTTP返回包时,必须先读取HTTP的包头,再根据包头的值来确定如何读,以及读多少数据,千万不能根据读到-1或available()为0来判断读到结尾。
判断读到HTTP包头的结尾是要找到\r\n\r\n。
2.如果HTTP返回包的格式为chunked+gzip,则每块chunked块头部指定的长度与实际长度一致,非chunked编码之前的长度。

本文地址:http://www.caihonger.com/tech27/



请写下您的评论