java socket输入流inputStream.read(byte[])方法一次读入多帧数据,也就是多帧数据连在一起
现实场景是这样的,建立了阻塞式socket连接,服务端一直往客户端发报文,客户端就一直用inputStream.read(byte)方式等着接受。问题是这样的,理论上,服...
现实场景是这样的,建立了阻塞式socket连接,服务端一直往客户端发报文,客户端就一直用inputStream.read(byte)方式等着接受。问题是这样的,理论上,服务端的报文是一帧一帧发的,而客户端实时等待从流中读取报文,但有时候一次in.read(byte[])会读出多帧连在一起的报文,这对报文解析和异常的捕获造成了很多麻烦。
现在我的问题是:
1.为什么会出现一次读取,取出多帧连在一起的报文?
2.有没有其他的数据流读入类能比InputStream更好的更好的解决这个问题,也就是一次读一帧的问题?注意这里服务端的报文长度是不固定的 展开
现在我的问题是:
1.为什么会出现一次读取,取出多帧连在一起的报文?
2.有没有其他的数据流读入类能比InputStream更好的更好的解决这个问题,也就是一次读一帧的问题?注意这里服务端的报文长度是不固定的 展开
1个回答
展开全部
因为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();
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询