記錄一個io流引起的tcp連續傳輸阻塞問題
阿新 • • 發佈:2019-02-07
tcp客戶端通過位元組陣列傳輸一個圖片到服務端,服務端陣列接收並寫到本地檔案;
重點是Client繼續傳送資料流到Server端。然後產生了問題:
客戶端程式碼:
public class Client { public static void main(String[] args) throws Exception, IOException { System.out.println("---------------------client-------------------"); Socket socket = new Socket(InetAddress.getLocalHost(), 8888); BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.jpg")); byte[] b = new byte[1024]; int len = 0; while ((len = bis.read(b)) != -1) { bos.write(b, 0, len); } bos.flush(); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("發給你了!!"); dos.flush(); bis.close(); socket.close(); } }
服務端程式碼:
public class Server { public static void main(String[] args) throws Exception { System.out.println("----------------------Server------------------"); ServerSocket server = new ServerSocket(8888); Socket socket = server.accept(); BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\b.jpg")); byte[] b = new byte[1024]; int len = 0; while((len=bis.read(b)) !=-1){ bos.write(b, 0, len); } bos.flush(); DataInputStream dis = new DataInputStream(socket.getInputStream()); String mess = dis.readUTF(); System.out.println(mess); bos.close(); server.close(); } }
執行結果: 簡單的tcp傳輸,不就是連續傳了兩個嗎,程式碼很簡單,怎麼會出問題???
遇到問題當然是問度娘,查谷歌了。但是,,,,問題能查到好多和我一樣的,解決方法沒有查到!!!這麼衰的麼?但是內心堅信不能隨隨便便放棄,畢竟這只是Javase的東西,還能搞不定嗎。
重點來了哈!!!
最後將問題鎖定在了這裡。
先看一下API中read方法的解釋:
這是個阻塞方法,在流可用之前,方法一直阻塞。因為客戶端是通過一個個陣列來傳遞資料,服務端一直等著接收陣列,然後才可以寫到本地上,所以當流建立的時候,read方法就一直阻塞來接收一個個陣列。當客戶端傳送完,流沒有斷,read還在一直阻塞著等著下一個陣列,等不到也死不回頭。所以出現了圖片傳完,不能繼續傳輸的問題。
解決辦法:
方法就就是想辦法讓read停下來。讀完圖片就停止阻塞,然後讓程式該幹啥幹啥。然後想到,圖片傳完,最後一個數組和前面陣列的區別不就是最後的陣列不會滿嗎?所以在where(read)里加一個判斷:
以此來判斷是不是傳輸圖片的最後一個數組。然後問題就解決啦。
新學菜鳥,如有問題歡迎指正,謝謝觀看哈!!