socket采用readline()方法产生阻塞及解决方案

前言:
由于要从硬件传感器端接收已经规定好的字符串数据,硬件方采用4G将数据发送,用socket编程将数据判别后格式化最后进行存储,具体源代码可以阅读上一篇博客 https://blog.csdn.net/yk2255/article/details/95981288

问题出现在硬件方在发送完数据后不能自行关闭socket,而readline()方法 在客户端socket未主动关闭 或者 读取的数据字符串未遇到 \n \r 回车,都是认为数据没有发送完毕,就造成readline() 会一直等待数据传送完毕,就造成了阻塞,导致程序不能顺利进行

解决方案
1 . 一开始想是在接收到的字符串后方拼接字符 \n 另其误认为结束,但是由于程序的顺序执行和阻塞 怎么拼接???? 失败
2. 开启新的线程 仍然不能解决我的问题,readline() 方法在它自己未能读取完时开启新的线程会返回null 失败
3. 利用 socket.shutdownOutput(); 方法提前半关闭读取的数据流 发现返回值是 null 并且会直接关闭客户端 失败
4. 让硬件端自主关闭或者加上 \n 不大可能

5. 最终解决方案
利用字节读取的方式,抛弃readline()的按行读取方式,就避免了其阻塞机制带来的问题,并且读取到一次数据后,直接将服务端将socket关闭,让其再次请求,虽然思想有些捞的一和对大量数据处理较慢,但是却正好符合这个项目的需求(个人认为这是最好的解决方案?)。 代码部分如下::::

InputStream is=socket.getInputStream();//服务端获取输入流
byte []b =new byte[1024];//采用byte数组 按字节进行数据的接收  避免readline()方法的阻塞机制!! 弊端是接受字节长度受限,但是在这个项目中足够了
int x= is.read(b, 0, b.length);//相较于readline()读取数据  字节读取慢  不适合大量数据的通信
String string=new String(b, 0, x);

附上网络调试助手链接链接: https://pan.baidu.com/s/189DCIsZyGp_7VhGqTzO2BA 提取码:xopd 对学习socket编程者,利于进行本机测试 网络助手百度云
如有错误,请规正。

你可能感兴趣的:(socket,java,后台数据交互)