日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/3/15 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程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的困扰一天才解决的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。