java socket输入流inputStream.read(byte[])方法一次读入多帧数据,也就是多帧数据连在一起

现实场景是这样的,建立了阻塞式socket连接,服务端一直往客户端发报文,客户端就一直用inputStream.read(byte)方式等着接受。问题是这样的,理论上,服... 现实场景是这样的,建立了阻塞式socket连接,服务端一直往客户端发报文,客户端就一直用inputStream.read(byte)方式等着接受。问题是这样的,理论上,服务端的报文是一帧一帧发的,而客户端实时等待从流中读取报文,但有时候一次in.read(byte[])会读出多帧连在一起的报文,这对报文解析和异常的捕获造成了很多麻烦。
现在我的问题是:
1.为什么会出现一次读取,取出多帧连在一起的报文?
2.有没有其他的数据流读入类能比InputStream更好的更好的解决这个问题,也就是一次读一帧的问题?注意这里服务端的报文长度是不固定的
展开
 我来答
552023943zjx
推荐于2017-09-29 · TA获得超过1040个赞
知道小有建树答主
回答量:260
采纳率:0%
帮助的人:334万
展开全部

因为inputStream.read(byte)是尽可能的读byte[]大小的数据,当你的服务端发送数据速度大于客户端读取数据的速度时,就会出现客户端读到多帧连在一起的报文。而这些发送数据,读取数据的速度是未知的。所以我们需要人为的来做一些调整。比如说每一帧作为一行写入Socket,客户端每次从socket读取一行。这样客户端每次都是读取一帧。

以上情况可以这样实现:在服务端使用PrintWriter

PrintWriter writer=new PrintWriter(socket.getOutputStream());
writer.println(data);

客户端可以使用BufferedReader

BufferedReader reader=new BufferedReader(new BufferedInputStream(socket.getInputStream()));
String s=reader.readLine();
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式