欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java socket接收保證能讀完數(shù)據(jù)的實例

 更新時間:2021年10月27日 12:01:59   作者:傲嬌萌萌噠  
這篇文章主要介紹了java socket接收保證能讀完數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

socket接收保證能讀完數(shù)據(jù)

//    private static byte[] readData(InputStream in,byte[] bData) throws IOException{
//      int readLength = in.read(bData);
//      if(readLength!=bData.length){
//          byte[] temp2 = readData(in,new byte[bData.length-readLength]);
//          System.arraycopy(temp2, 0, bData, readLength, temp2.length);
//          return bData;
//      }else{
//          return bData;
//      }
//    }
//    private static void readData(InputStream in,byte[] bData) throws IOException{
//      readData(in,bData,0,bData.length);
//    }
//    private static void readData(InputStream in,byte[] bData,int off,int length) throws IOException{
//      int readLength = in.read(bData, off, length);
//      if(readLength!=length){
//          readData(in,bData,readLength+off,length-readLength);
//      }
//    }
//    private static void readData(InputStream in,byte[] bData,int off,int length) throws IOException{
//
//      while(true){
//          int readLength = in.read(bData, off, length);
//          if(readLength!=length){
//              off = readLength+off;
//              length = length-readLength;
//          }else{
//              break;
//          }
//      }
//    }
//    private static void readData(InputStream in,byte[] bData,int off,int length) throws IOException{
//      int readLength = 0;
//      do{
//          off = readLength+off;
//          length = length-readLength;
//          readLength = in.read(bData, off, length);
//      }while(readLength!=length);
//    }
    /**
     * 最終使用此方法
     * @param in  輸入流
         * @param bData  讀取數(shù)據(jù)
     * @throws IOException  
     */
    private static void readData(InputStream in,byte[] bData) throws IOException{
        int off = 0;
        int length = bData.length;
        int readLength = 0;
        do{
            off = readLength+off;
            length = length-readLength;
            readLength = in.read(bData, off, length);
        }while(readLength!=length);
    }

socket接收硬件字節(jié)數(shù)據(jù)并解析

第一次接觸這種類型的項目,在處理數(shù)據(jù)過程中,發(fā)現(xiàn)了許多問題,記錄一下,加深記憶。

硬件將數(shù)據(jù)寫在一個buffer中,傳輸過來的是字節(jié)。

一開始我們想到的是按照字節(jié)流來接收,但是,C語言中,byte類型沒有符號位,最大值位255,java中byte類型帶有符號位,最大值為127,問題就出現(xiàn)了,當接收到的字節(jié)數(shù)據(jù)超過127時,會取第一位為符號位,后幾位補碼,取反再加一變成負數(shù)。(處理方法后面有寫到)

后來想偷懶不處理數(shù)據(jù)的基礎上,考慮用char數(shù)組接收。char一共十六位,絕對是可以接收下硬件發(fā)來的八位數(shù)據(jù)的。但是再接收數(shù)據(jù)的時候,還是出現(xiàn)了問題。在對字節(jié)流轉變?yōu)樽址鞑⒈4娴絚har數(shù)組中的時候,char類型會自動對數(shù)據(jù)進行處理。在char類型中,字符所對應的最大十六進制是7F,但硬件傳輸來的數(shù)據(jù)存在如0X80,0X8D的情況。當char類型接收到大于7F的數(shù)據(jù)時,無法處理,字符會變成亂碼的格式,數(shù)據(jù)相對應的也會發(fā)生改變。在接收數(shù)據(jù)的時候就無法正確存儲,更別提后期對數(shù)據(jù)進行正確處理和校驗了。放棄。

最終還是要回到byte接收的方向上。和同事討論了下,對于超過java byte類型的數(shù)據(jù),進行相應處理后,存放在Int中,即可保證數(shù)據(jù)正確性。

處理方法:

對byte數(shù)組中的數(shù)據(jù)進行判斷,當為負數(shù)時,與0xff相與,并存放在Int數(shù)組中,可以保證數(shù)據(jù)正常

ServerSocket serverSocket;
    try {
 serverSocket = new ServerSocket(9090);
 System.out.println("***等待客戶端連接***");
 Socket socket = serverSocket.accept();
 InputStream is = socket.getInputStream();
   
 byte[] datas = new byte[500];
 int count = is.read(datas);
   
 int[] dataFormat=new int[500];
 for(int i=0;i<datas.length;i++){
  if(datas[i]<0){
   dataFormat[i]=datas[i]&0xff;
  }else{
   dataFormat[i]=datas[i];
  }
 }
     } catch (IOException e) {
 e.printStackTrace();
     }

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

相關文章

  • SpringBoot實現(xiàn)多個子域共享cookie的示例

    SpringBoot實現(xiàn)多個子域共享cookie的示例

    本文主要介紹了SpringBoot實現(xiàn)多個子域共享cookie的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 淺談Spring refresh的工作流程

    淺談Spring refresh的工作流程

    這篇文章主要介紹了淺談Spring refresh的工作流程,refresh 是 AbstractApplicationContext 中的一個方法,負責初始化 ApplicationContext容器,讓我們一起來學習一下吧
    2023-04-04
  • 通過volatile驗證線程之間的可見性

    通過volatile驗證線程之間的可見性

    這篇文章主要介紹了通過volatile驗證線程之間的可見性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • JAVA如何按字節(jié)截取字符串

    JAVA如何按字節(jié)截取字符串

    這篇文章主要介紹了JAVA如何按字節(jié)截取字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • java?JUC信號量Semaphore原理及使用介紹

    java?JUC信號量Semaphore原理及使用介紹

    這篇文章主要為大家介紹了java?JUC信號量Semaphore原理及使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 關于jd-gui啟動報This?program?requires?Java?1.8+的錯誤問題及解決方法

    關于jd-gui啟動報This?program?requires?Java?1.8+的錯誤問題及解決方法

    最近,在Mac使用上JD-GUI啟動時總是報錯,接下來通過本文給大家介紹關于jd-gui啟動報this?program?requires?Java?1.8+的錯誤問題及解決方法,需要的朋友可以參考下
    2022-05-05
  • Java如何使用Iterator迭代器刪除集合重復選項

    Java如何使用Iterator迭代器刪除集合重復選項

    這篇文章主要介紹了Java如何使用Iterator迭代器刪除集合重復選項,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • SpringMVC+MyBatis分頁(最新)

    SpringMVC+MyBatis分頁(最新)

    本篇文章主要介紹了SpringMVC+MyBatis分頁,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • Java實現(xiàn)獲取指定個數(shù)的不同隨機數(shù)

    Java實現(xiàn)獲取指定個數(shù)的不同隨機數(shù)

    今天小編就為大家分享一篇關于Java實現(xiàn)獲取指定個數(shù)的不同隨機數(shù),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringBoot部署到外部Tomcat無法注冊到Nacos服務端的解決思路

    SpringBoot部署到外部Tomcat無法注冊到Nacos服務端的解決思路

    這篇文章主要介紹了SpringBoot部署到外部Tomcat無法注冊到Nacos服務端,本文給大家分享完美解決思路,結合實例代碼給大家講解的非常詳細,需要的朋友可以參考下
    2023-03-03

最新評論