1. 程式人生 > >記錄一個io流引起的tcp連續傳輸阻塞問題

記錄一個io流引起的tcp連續傳輸阻塞問題

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)里加一個判斷:

以此來判斷是不是傳輸圖片的最後一個數組。然後問題就解決啦。

新學菜鳥,如有問題歡迎指正,謝謝觀看哈!!