多线程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[]{*}; //指令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的困扰一天才解决的问题相关推荐
- Java多线程socket网络协议传输
Java和大数据系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等 ...
- 多线程+SOCKET编程实现qq群聊的服务端和客户端
多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...
- 多线程+socket 实现群聊服务器
通过多线程+Socket,实现群聊服务器. 服务端: 每当有一个连接时,服务端起一个线程去维护: .将收到的信息转发给所有的客户端: 当某个客户端断开连接时需要处理断开连接 客户端: 接收与发送信息 ...
- 多线程socket通信server
控制台下实现多线程socket通信,服务端为每个请求的客户端创建一个线程,进行通信.其实这些MSDN里都有. 一.基本流程如下: 定义变量->获得winsock版本->加载winsock库 ...
- java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串
我正在使用Socket与ServerSocket进行通信.字符串正从服务器发送到我的套接字.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪. 问题在于数据正在"爆 ...
- 多线程下ArrayList类线程不安全的解决方法及原理
多线程下ArrayList类线程不安全的解决方法及原理 参考文章: (1)多线程下ArrayList类线程不安全的解决方法及原理 (2)https://www.cnblogs.com/fangting ...
- 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' ( ...
- 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 ...
- inputstream读取html乱码,java InputStream 读取汉语言内容的解决乱码
java InputStream 读取中文内容的解决乱码 String suffix=file.substring(file.lastIndexOf('.')+1,file.length()); if ...
最新文章
- C#中的Partial
- APK安装时如何拷贝apk里的文件到sdcard
- Qt-ros插件:创建工程,编译实现操控小乌龟(二)
- python登录代码思路_终于找到一个思路比较清晰的可以模拟登录百度的代码!
- aliyun maven 添加jar_阿里云Maven配置,Maven仓库配置,Maven镜像配置
- 华为云ModelArts2.0来袭
- 通俗易懂的Monte Carlo积分方法(四)
- 优秀的长截图标注工具:iShot for Mac中文免费
- PROE 安装提示注册号丢失
- 宽带拨号上服务器无响应,宽带拨号服务器无响应(图文)
- java读文件写文件
- 阿里云企业邮箱有免费的吗?如何申请?
- uva1391Astronauts【2-SAT】
- C++的输入、输出与文件
- Vue之filters传参问题
- CC00052.LBCHAC——|Selinux.V2|——|2台server|
- Android12 apk安装失败 安装包异常 安装包大小显示1k
- K-S指标校验评分卡
- Centos7搭建lamp环境后外网浏览器不能访问
- 【数据治理-01】开篇:一起聊聊数据治理
热门文章
- NYOJ 597 完数?
- [题解](双向bfs)hdu_3085_Nightmare Ⅱ
- FLP不可能性(FLP impossibility)
- 使用Apache php 的一些基本操作(一)
- JavaScript实用小技巧
- jsp用include指令引入html时的乱码问题
- ASP.NETserver控件使用之Reportviewer 报表
- Delphi编程注意事项
- Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block
- openmp使用经验