• 技术文章 >Java >java教程

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

    零下一度零下一度2017-05-27 09:59:22原创1668
    本篇文章主要介绍了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.printStackTrace(); 
              } 
            } 
          } 
        } 
      } 
     
    }

    【相关推荐】

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

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

    3. 常见的socket error错误总结

    4. 总结socket和http的区别

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

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:java,socket,粘包
    上一篇:基于Java生成验证码功能的实例教程 下一篇:分享Spring Boot使用Spring security 集成CAS实例
    线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 一招教你使用java快速创建Map(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一文讲解Java中初始化List集合的8种方式(附代码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网