亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java socket大數(shù)據(jù)傳輸丟失問題及解決

 更新時間:2024年08月10日 14:05:30   作者:yahahassr  
這篇文章主要介紹了java socket大數(shù)據(jù)傳輸丟失問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

java socket大數(shù)據(jù)傳輸丟失

最近遇見一個問題。利用java 的socket進行數(shù)據(jù)傳輸時,當數(shù)據(jù)量過大,比如4w個字節(jié)。

這時候我在客戶端輸出流將數(shù)據(jù)發(fā)送給服務器。

服務器如果利用數(shù)組接收時(即is.read(byte[])方法),接收到的數(shù)據(jù)不全。網(wǎng)上解決方法。

一、分批發(fā)送,分批讀取,并不要直接讀取

將輸入輸出流利用BufferedInputStream包裝。

實測這種方法不能根本上解決問題,治標不治本。還是會有概率丟失。

二、實際上,數(shù)據(jù)是不會丟失的

即使輸入數(shù)據(jù)過大導致溢出。數(shù)據(jù)也不會丟失。

根據(jù)觀察,應該只是數(shù)據(jù)還沒有傳輸過來,但是利用is.read(byte[])方法時,即使讀取到的數(shù)據(jù)不到byte[]數(shù)組長度時,該方法也可以進行下去,不會阻塞?。?!

譬如以下代碼:

public class Test {
    @org.junit.Test
    public void server() throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true){
            Socket accept = serverSocket.accept();
            InputStream is = accept.getInputStream();
            byte[] bytes = new byte[5];
            int len = is.read(bytes);
            System.out.println(Arrays.toString(bytes));//發(fā)送端發(fā)送的數(shù)據(jù)只有兩個字節(jié),我們接收端設置為5個字節(jié)的字節(jié)數(shù)組,結果打印[1,2,0,0,0],而不會在上一步阻塞
        }
    }

    @org.junit.Test
    public void client() throws IOException {
        Socket socket = new Socket("127.0.0.1",8080);
        OutputStream os = socket.getOutputStream();
        os.write(new byte[]{1,2});
    }
}

從這個例子我們就知道為什么會丟失數(shù)據(jù)了。

原因有兩點:

  • 網(wǎng)絡延時
  • inputStream.read(byte[])方法讀取的數(shù)據(jù)長度不一定等于byte[]數(shù)組長度

根據(jù)以上兩點,修改后的接收端代碼應該如此。

public static byte[] readData(InputStream is,int length) throws IOException {
        byte[] bytes = new byte[length];
        int index = 0;
        int len = 0;
        while(index < length){
            len = is.read(bytes,index,length - index);
            //每次讀取完判斷數(shù)據(jù)是否全部讀取完畢
            if(len > 0){
                index += len;
            }else {
                break;
            }
        }
        return bytes;
    }

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論