全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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(); 
          } 
        } 
      } 
    } 
  } 
 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # socket粘包处理  # socket  # 粘包  # 粘包解决  # Java Web项目中使用Socket通信多线程、长连接的方法  # Java实现的基于socket通信的实例代码  # php与java通过socket通信的实现代码  # JAVA实现基于Tcp协议的简单Socket通信实例  # Python与Java间Socket通信实例代码  # Java Socket实现多线程通信功能示例  # Java--Socket通信(客户端服务端双向)  # JAVA中实现原生的 socket 通信机制原理  # Java使用Socket通信传输文件的方法示例  # Java Socket实现单线程通信的方法示例  # Java开发实现的Socket双向通信功能示例  # 客户端  # 很重要  # 请注意  # 这两天  # 服务端  # 大家多多  # 过程中  # SOAP  # lt  # send  # gt  # System  # ENV  # Envelope  # Thread  # private  # SendThread  # extends  # true  # sleep 


相关文章: 如何在Tomcat中配置并部署网站项目?  建站主机如何安装配置?新手必看操作指南  如何使用Golang安装API文档生成工具_快速生成接口文档  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何高效利用亚马逊云主机搭建企业网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何快速搭建支持数据库操作的智能建站平台?  如何通过FTP服务器快速搭建网站?  如何在西部数码注册域名并快速搭建网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  C#如何使用XPathNavigator高效查询XML  建站主机助手选型指南:2025年热门推荐与高效部署技巧  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  公司网站的制作公司,企业网站制作基本流程有哪些?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  宝塔面板如何快速创建新站点?  *服务器网站为何频现安全漏洞?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  如何在阿里云ECS服务器部署织梦CMS网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在阿里云完成域名注册与建站?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何在建站主机中优化服务器配置?  兔展官网 在线制作,怎样制作微信请帖?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  英语简历制作免费网站推荐,如何将简历翻译成英文?  图册素材网站设计制作软件,图册的导出方式有几种?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  深圳网站制作的公司有哪些,dido官方网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  ,南京靠谱的征婚网站?  网站企业制作流程,用什么语言做企业网站比较好?  再谈Python中的字符串与字符编码(推荐)  实例解析Array和String方法  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站之星后台密码遗忘如何找回?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何解决ASP生成WAP建站中文乱码问题?  建站主机如何选?性能与价格怎样平衡?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何通过wdcp面板快速创建网站?  如何快速搭建高效简练网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。