多线程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的困扰一天才解决的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B端训练-明日开启
- 下一篇: 2019-2020年中国小吃产业发展报告