• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

分享java中处理socket通信过程中粘包情况的实例代码

java 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论

本篇文章主要介绍了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长度的字节子数组作为报文长度,你懂得           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.printStackTr<b>本文来源gao@dai!ma.com搞$代^码!网7</b>ace();           }         }       }     }   }  }

【相关推荐】

1. java与php通过socket通信的实例教程

2. 详解HTML5中的WebSocket及实例代码

3. 常见的socket error错误总结

4. 总结socket和http的区别

以上就是分享java中处理socket通信过程中粘包情况的实例代码的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:分享java中处理socket通信过程中粘包情况的实例代码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址