多线程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[]{*};    //指令abyte com2[] = new byte[]{*};    //指令bbyte 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[]{*};    //指令abyte com2[] = new byte[]{*};    //指令bbyte 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();}}

于是,解决了这个问题。

多线程Socket的InputStream的困扰一天才解决的问题相关推荐

  1. Java多线程socket网络协议传输

    Java和大数据系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等 ...

  2. 多线程+SOCKET编程实现qq群聊的服务端和客户端

    多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...

  3. 多线程+socket 实现群聊服务器

    通过多线程+Socket,实现群聊服务器. 服务端: 每当有一个连接时,服务端起一个线程去维护: .将收到的信息转发给所有的客户端: 当某个客户端断开连接时需要处理断开连接 客户端: 接收与发送信息 ...

  4. 多线程socket通信server

    控制台下实现多线程socket通信,服务端为每个请求的客户端创建一个线程,进行通信.其实这些MSDN里都有. 一.基本流程如下: 定义变量->获得winsock版本->加载winsock库 ...

  5. java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串

    我正在使用Socket与ServerSocket进行通信.字符串正从服务器发送到我的套接字.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪. 问题在于数据正在"爆 ...

  6. 多线程下ArrayList类线程不安全的解决方法及原理

    多线程下ArrayList类线程不安全的解决方法及原理 参考文章: (1)多线程下ArrayList类线程不安全的解决方法及原理 (2)https://www.cnblogs.com/fangting ...

  7. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)解决方法

    登陆mysql的时候,出现了这个问题: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' ( ...

  8. Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'的解决

    Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'的解决 原因是目录 的访问权限问题,ub ...

  9. inputstream读取html乱码,java InputStream 读取汉语言内容的解决乱码

    java InputStream 读取中文内容的解决乱码 String suffix=file.substring(file.lastIndexOf('.')+1,file.length()); if ...

最新文章

  1. C#中的Partial
  2. APK安装时如何拷贝apk里的文件到sdcard
  3. Qt-ros插件:创建工程,编译实现操控小乌龟(二)
  4. python登录代码思路_终于找到一个思路比较清晰的可以模拟登录百度的代码!
  5. aliyun maven 添加jar_阿里云Maven配置,Maven仓库配置,Maven镜像配置
  6. 华为云ModelArts2.0来袭
  7. 通俗易懂的Monte Carlo积分方法(四)
  8. 优秀的长截图标注工具:iShot for Mac中文免费
  9. PROE 安装提示注册号丢失
  10. 宽带拨号上服务器无响应,宽带拨号服务器无响应(图文)
  11. java读文件写文件
  12. 阿里云企业邮箱有免费的吗?如何申请?
  13. uva1391Astronauts【2-SAT】
  14. C++的输入、输出与文件
  15. Vue之filters传参问题
  16. CC00052.LBCHAC——|Selinux.V2|——|2台server|
  17. Android12 apk安装失败 安装包异常 安装包大小显示1k
  18. K-S指标校验评分卡
  19. Centos7搭建lamp环境后外网浏览器不能访问
  20. 【数据治理-01】开篇:一起聊聊数据治理

热门文章

  1. NYOJ 597 完数?
  2. [题解](双向bfs)hdu_3085_Nightmare Ⅱ
  3. FLP不可能性(FLP impossibility)
  4. 使用Apache php 的一些基本操作(一)
  5. JavaScript实用小技巧
  6. jsp用include指令引入html时的乱码问题
  7. ASP.NETserver控件使用之Reportviewer 报表
  8. Delphi编程注意事项
  9. Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block
  10. openmp使用经验