多线程Socket的InputStream的困扰一天才解决的问题

多线程Socket的InputStream的问题

这几天都在开发一个学生时代的一个小项目(SSH开发),导致没有时间去学习理论基础。没错,我汇编都还不太懂就开发了(就更别说我懂操作系统了),这导致在写项目的时候遇到很多瓶颈。当自己想写一个程序实现一个底层功能的时候发现特别鸡肋

因此,写一篇自己遇到的一个底层与单片机通信的问题。

在这里大家发现了,单片机怎么用socket来做呢?没错,大家挺聪明的。这个单片机有一个网卡模块,所以用到我们所学的TCP/IP协议栈中的TCP来实现。

描述自己遇到的一个问题:发送指令给单片机,单片机回复相应数据,这是正常的。但是,例如:发送指令a后,回复指令a相应该返回的数据后。再一次向单片机发送指令b,发现回复的还是a相应的数据。

第一次尝试排错:遇到这个BUG的时候,我首先是想着,是否是自己发送的数据写错。发现没有!

第二次尝试排错:这个时候想得是,既然自己写的代码没有错。那我应该写一个模拟发送数据和接收数据的单元,如下代码:

//异常直接抛就行了,毕竟测试。记住端口异常,很容易忘记停止当前demo就有开启一个ServerSocket
public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(port);   //服务器端口号
        Socket socket = ss.accept();                //单片机
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        byte com1[] = new byte[]{*};    //指令a
        byte com2[] = new byte[]{*};    //指令b
        byte line[] = new byte[n];      //回复数据长度
        outputStream.write(com1);
        outputStream.write(com2);
        while(inputStream.read(line)!=-1){
            System.out.println(Arrays.toString(line));      //将读取到指令a的2条返回
        }
    }

此刻,纳闷了,为什么单片机会发送2次回复数据呢?然后开启串口调试工具,用TCP模拟器实验单片机与模拟器之间的一个回复情况,并没有出现回复2次数据的异常!!这下懵逼了,就去百度有没有清空InputStream流的方法,发现没有。这个时候就去看了一下API流的继承关系,可以看出:每个流都有对应的功能(比如文件流,缓冲流,套接字流)。这下子反应过来了,套接字应该会提供一个提供流读取的方法

于是第三次尝试:API查找相应的方法,发现一个shutdownInput()方法。功能是:此套接字的输入流置于“流的末尾”。感觉跟清空的方式差不多,都是讲读写头移动到了下次读取的数据开始位置。于是改进一下代码:

//异常直接抛就行了,毕竟测试。记住端口异常,很容易忘记停止当前demo就有开启一个ServerSocket
public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(port);   //服务器端口号
        Socket socket = ss.accept();                //单片机
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        byte com1[] = new byte[]{*};    //指令a
        byte com2[] = new byte[]{*};    //指令b
        byte line[] = new byte[n];      //回复数据长度
        outputStream.write(com1);
        outputStream.write(com2);       //这条指令及时加上了n次,控制台就只输出1次数据
        while(inputStream.read(line)!=-1){
            System.out.println(Arrays.toString(line));
            socket.shutdownInput();
        }
    }

于是,解决了这个问题。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值