Java Socket 服務端 記錄一下

最近在做刷卡機設備對接,涉及報文傳送。刷卡機爲客戶端,自己寫服務端。

上代碼(服務端):
 public void run(){ 
        InputStream is = null;
        OutputStream os = null;
        PrintWriter pw = null;
        String toMidStr="";
        try{
          is = socket.getInputStream(); //  //獲取一個輸入流,並讀取客戶端的信息
          BufferedInputStream bis = new BufferedInputStream(is);  //  流存放緩衝區
          DataInputStream dis = new DataInputStream(bis);
          byte[] bytes = new byte[1]; // 一次讀取一個byte
          String ret = "";
          while (dis.read(bytes) != -1) {  //此處是按照字節來讀取,網上bufferreader  readLine也可以,根據自己情況而定。
              ret += BWUtil.bytesToHexString(bytes) + " ";  //調用字節轉化16進制字符串方法
              if (dis.available() == 0) { //此處如果dis.available()爲零了就是讀取完畢了
                  System.out.println("收到報文數據: " + ret);
                  toMidStr = BWUtil.bwToMid(ret);
                  //System.out.println("上位機返回報文:"+toMidStr);
                  ret = "";
                  break;//此處要跳出,否則一直處於讀取等待中
              } 
          }
          socket.shutdownInput();//關閉輸入流
          //獲取輸出流,響應客戶端的請求
          os = socket.getOutputStream();
          //包裝爲打印流   
           os.write(BWUtil.str2HexByte(toMidStr));//此處BWUtil.str2HexByte(toMidStr)方法把字符串直接轉化爲byte數組輸出,不再進行來回轉化,否則大於0x80的轉換成char會有問題,此處耽誤時間較長。。。
           os.flush();//將緩存輸出
         
         socket.shutdownOutput();
        }catch(IOException e) { 
          e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            try{
              if(os != null)
                os.close();
              if(is != null)
                is.close();
             if(socket != null)
                socket.close(); 
            }catch(IOException e) { 
              e.printStackTrace();
            }
        }
    
      }

字符串轉數組處理方法:很感謝網友的貢獻。感謝同仁無私分享。
 public static byte[] str2HexByte(String data) {
        if(1==data.length()%2)
            return null;
        else{
            byte[] li = new byte[data.length()/2];
            for (int i = 0; i < data.length(); i+=2) {
                int cp1 = data.codePointAt(i);
                int cp2 = data.codePointAt(i+1);
                li[i/2] = (byte)(asc2Hex(cp1)<<4|asc2Hex(cp2));
            }
            return li;
        }
    }
    public static int asc2Hex(int data){
        int li;
        if(data >= 0X30 && data <= 0X39){//0-9
            li = data - 0X30;
        }else if (data >= 0X41 && data <= 0X5A){//A-F
            li = data - 0X37;
        }else if(data >= 0X61 && data <= 0X7A){//a-f
            li = data - 0X57;
        }else{
            li = data;
        }
        return li;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章