最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中處理socket通信過程中粘包的情況

 更新時間:2017年05月25日 14:23:31   作者:二十七路公交車  
本篇文章主要介紹了java中處理socket通信過程中粘包的情況,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這兩天學習了java中處理socket通信過程中粘包的情況,而且很重要,所以,今天添加一點小筆記。

處理粘包程序是客戶端的接受消息線程:

客戶端:

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.Reader; 
import java.net.Socket; 
import java.nio.CharBuffer; 
 
public class TestSocketClient { 
 
   
  public static void main(String[] args) { 
    // TODO Auto-generated method stub 
     
    new TestSocketClient().start(); 
  } 
  class SendThread extends Thread{ 
    private Socket socket; 
    public SendThread(Socket socket){ 
      this.socket=socket; 
    } 
    @Override 
    public void run(){ 
      while(true){ 
        try{ 
          Thread.sleep(1000);  
          String send="<SOAP-ENV:Envelope>"+System.currentTimeMillis()+"</SOAP-ENV:Envelope>"; 
          PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
          pw.write(send); 
          pw.flush(); 
        }catch(Exception e){ 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 
  class ReceiveThread extends Thread{ 
    private Socket socket; 
    private volatile byte[] bytes=new byte[0]; 
    public ReceiveThread(Socket socket){ 
      this.socket=socket; 
    } 
    public byte[] mergebyte(byte[] a,byte[] b,int begin,int end){ 
      byte[] add=new byte[a.length+end-begin]; 
      int i=0; 
      for(i=0;i<a.length;i++){ 
        add[i]=a[i]; 
      } 
      for(int k=begin;k<end;k++,i++){ 
        add[i]=b[k]; 
      } 
      return add; 
    } 
    @Override 
    public void run(){ 
      while(true){ 
        try{ 
          InputStream reader=socket.getInputStream(); 
          if(bytes.length<2){ 
            byte[] head=new byte[2-bytes.length]; 
            int couter=reader.read(head); 
            if(couter<0){ 
              continue; 
            } 
            bytes=mergebyte(bytes,head,0,couter); 
            if(couter<2){ 
              continue; 
            } 
          } 
          //下面這個值請注意,一定要取2長度的字節(jié)子數(shù)組作為報文長度,你懂得 
          byte[] temp=new byte[0]; 
          temp=mergebyte(temp,bytes,0,2); 
          String templength=new String(temp); 
          int bodylength=Integer.parseInt(templength);       
          if(bytes.length-2<bodylength){ 
            byte[] body=new byte[bodylength+2-bytes.length]; 
            int couter=reader.read(body); 
            if(couter<0){ 
              continue; 
            } 
            bytes=mergebyte(bytes,body,0,couter); 
            if(couter<body.length){ 
              continue; 
            } 
          } 
          byte[] body=new byte[0]; 
          body=mergebyte(body, bytes, 2, bytes.length); 
          System.out.println("client receive body:  "+new String(body)); 
          bytes=new byte[0]; 
        }catch(Exception e){ 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 
  public void start(){ 
    try{ 
    Socket socket=new Socket("127.0.0.1",18889); 
    new SendThread(socket).start(); 
    new ReceiveThread(socket).start(); 
    }catch(Exception e){ 
      e.printStackTrace(); 
    } 
     
  } 
} 

服務端:

package com.meituan.service.bankgate.gateway; 
 
/** 
 * Created by cqx on 16/7/19. 
 */ 
import java.io.*; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.nio.CharBuffer; 
import java.util.Date; 
 
public class TESTAHAHHA { 
 
  private final static String SOAP_BEGIN = "<SOAP-ENV:Envelope"; 
  private final static String SOAP_END = "</SOAP-ENV:Envelope>"; 
  public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    TESTAHAHHA testserver=new TESTAHAHHA(); 
    testserver.start(); 
  } 
  public void start(){ 
    try{ 
      ServerSocket serversocket=new ServerSocket(18889); 
      while(true){ 
        Socket socket=serversocket.accept(); 
        new SocketThread(socket).start(); 
      } 
    }catch(Exception e){ 
      e.printStackTrace(); 
    } 
 
  } 
  class SocketThread extends Thread{ 
    private Socket socket; 
    private String temp; 
    public SocketThread(Socket socket){ 
      this.socket=socket; 
    } 
    public Socket getsocket(){ 
      return this.socket; 
    } 
    public void setsocjet(Socket socket){ 
      this.socket=socket; 
    } 
 
    @Override 
    public void run(){ 
      try{ 
        Reader reader=new InputStreamReader(socket.getInputStream()); 
        // Writer writer=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8")); 
        OutputStream writer=socket.getOutputStream(); 
        CharBuffer charbuffer=CharBuffer.allocate(8192); 
        int readindex=-1; 
        while((readindex=reader.read(charbuffer))!=-1){ 
          charbuffer.flip(); 
          temp+=charbuffer.toString(); 
          if(temp.indexOf(SOAP_BEGIN)!=-1 && temp.indexOf(SOAP_END)!=-1){ 
            //System.out.println(new Date().toLocaleString()+"server:"+temp); 
            temp=""; 
            String str="receive the soap message hahahah"; 
            byte[] headbytes=str.getBytes(); 
            int length=headbytes.length; 
            String l=String.valueOf(length); 
            byte[] lengthbytes=l.getBytes(); 
            byte[] bytes=new byte[length+lengthbytes.length]; 
            int i=0; 
            for(i=0;i<lengthbytes.length;i++){ 
              bytes[i]=lengthbytes[i]; 
            } 
            for(int j=i,k=0;k<length;k++,j++){ 
              bytes[j]=headbytes[k]; 
            } 
            System.out.println("server send:"+new String(bytes)); 
            writer.write(bytes); 
            writer.flush(); 
          }else if(temp.indexOf(SOAP_BEGIN)!=-1){ 
            temp=temp.substring(temp.indexOf(SOAP_BEGIN)); 
          } 
          if(temp.length()>1024*16){ 
            break; 
          } 
        } 
      }catch(Exception e){ 
        e.printStackTrace(); 
      }finally{ 
        if(socket!=null){ 
          try{ 
            if(!socket.isClosed()){ 
              socket.close(); 
            } 
          }catch(Exception e){ 
            e.printStackTrace(); 
          } 
        } 
      } 
    } 
  } 
 
} 

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    XMLType是Oracle支持的一種基于XML格式存儲的數(shù)據(jù)類型,這里我們共同來探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)的方法:
    2016-07-07
  • JAVA中通過Redis實現(xiàn)延時任務demo實例

    JAVA中通過Redis實現(xiàn)延時任務demo實例

    Redis在2.0版本時引入了發(fā)布訂閱(pub/sub)功能,在發(fā)布訂閱中有一個channel(頻道),與消息隊列中的topic(主題)類似,可以通過redis的發(fā)布訂閱者模式實現(xiàn)延時任務功能,實例中會議室預約系統(tǒng),用戶預約管理員審核后生效,如未審批,需要自動變超期未處理,使用延時任務
    2024-08-08
  • Spring Boot thymeleaf模板引擎的使用詳解

    Spring Boot thymeleaf模板引擎的使用詳解

    這篇文章主要介紹了Spring Boot thymeleaf模板引擎的使用詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • java如何執(zhí)行l(wèi)inux命令

    java如何執(zhí)行l(wèi)inux命令

    這篇文章主要介紹了java如何執(zhí)行l(wèi)inux命令問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決

    springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決

    這篇文章主要介紹了springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友參考下吧
    2023-12-12
  • Java如何利用return結束方法調用

    Java如何利用return結束方法調用

    這篇文章主要介紹了Java如何利用return結束方法調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • lazy?init控制加載在Spring中如何實現(xiàn)源碼分析

    lazy?init控制加載在Spring中如何實現(xiàn)源碼分析

    這篇文章主要為大家介紹了lazy?init控制加載在Spring中如何實現(xiàn)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Mybatis的sql語句執(zhí)行異常后打印到日志問題

    Mybatis的sql語句執(zhí)行異常后打印到日志問題

    文章介紹了一種Mybatis異常日志打印方案,主要通過Mybatis攔截器獲取執(zhí)行的sql語句,并利用ThreadLocal存儲,以避免多線程下的sql語句覆蓋問題,當異常發(fā)生時,從ThreadLocal中取出sql語句并打印到單獨的日志文件中,方便數(shù)據(jù)恢復,該方案經(jīng)過壓力測試
    2024-10-10
  • Springboot 掃描mapper接口的2種操作

    Springboot 掃描mapper接口的2種操作

    這篇文章主要介紹了Springboot 掃描mapper接口的2種操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java編程實現(xiàn)多人聊天室功能

    java編程實現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細介紹了java編程實現(xiàn)多人聊天室功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

扬中市| 缙云县| 汉沽区| 五河县| 若尔盖县| 兰西县| 宜城市| 乐陵市| 丹东市| 定陶县| 乐业县| 治多县| 吉木乃县| 如皋市| 聊城市| 二连浩特市| 清原| 达日县| 齐齐哈尔市| 宜州市| 闵行区| 徐汇区| 谢通门县| 华安县| 潜山县| 龙川县| 巩义市| 南投县| 迭部县| 平远县| 莲花县| 新巴尔虎右旗| 美姑县| 罗源县| 娱乐| 黄平县| 西平县| 张北县| 大新县| 工布江达县| 高安市|