本篇文章主要介绍了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=""+System.currentTimeMillis()+"";

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

add[i]=a[i];

}

for(int k=begin;k

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

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

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 = "

private final static String SOAP_END = "

";

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

bytes[i]=lengthbytes[i];

}

for(int j=i,k=0;k

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分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码相关推荐

  1. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

  2. html tabl自动生成序列号,jQuery实现table中的tr上下移动并保持序号不变的实例代码...

    jQueryMoveTr.html 代码如下: jQuery-bhang aaaaaaaaaa @@@@@@@ 注释1 bbbbbbbbbbbbb ######### 注释2 cccccccccccc ...

  3. java之pdf转图片的几种方式,以及在使用过程中遇到的问题和处理方案

    java之pdf转图片的几种方式,以及在使用过程中遇到的问题和处理方案 方式 pdfBox iText(方式同上) spire.pdf.free(方式同上) 遇到的问题 图片清晰度.这种方式都有这个问 ...

  4. java当中有关循环的代码_有关Java循环的内容,编程中还是比较常用的,下面分享给大家几个循环的示例代码,练习一下。1、循环输出1到100之间所有能被3或能被4整除的数。pack...

    有关Java循环的内容,编程中还是比较常用的,下面分享给大家几个循环的示例代码,练习一下. 1.循环输出1到100之间所有能被3或能被4整除的数. package com.hz.loop02; /** ...

  5. java 包命名_【Java】包的命名规则

    命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...

  6. java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码

    CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...

  7. java调节音量代码_用Java调用VC音量控制程序_java

    前言 本文通过java的Runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量. 使用VC编写音量控制程序 本控 ...

  8. java更改包名称_更改Java包名称如何改变我的系统架构

    java更改包名称 即使只是少量更改角度,也可能对您如何使用系统产生深远影响. 假设您正在用Java编写Web应用程序. 在系统中,您处理订单,客户和产品. 作为一个Web应用程序,您的类包括诸如Co ...

  9. java服务器代码_简单java服务器

    [java]代码库import java.io.InputStream; import java.io.OutputStream; import java.net.*; public class Ch ...

最新文章

  1. “;“分号空语句的使用
  2. C#实现类似qq的屏幕截图程序
  3. Linux中的管道与重定向
  4. 2017软件测试考试分值,【2017年整理】软件测试性能指标.docx
  5. 如何打造一支高效的AI团队
  6. 如何排查 .NET 内存泄漏
  7. 配置了坐标还是找不到serv_为什么老人家总是这疼那疼,还找不到原因?是矫情还是另有原因...
  8. Hbase2.0版本安装教程
  9. MDB图表统计bootstrap后台模板
  10. 安杰文高等计算机与生产技术学校,法国留学院校推荐:安杰文高等计算机与生产技术学校...
  11. 微软操作系统总裁:Win8应用商店是发展必然
  12. [模拟|数位] leetcode 9 回文数
  13. [Bochs]Bochs调试技术
  14. php怎么转换bt,php格式的文件转成bt种子文件的方法
  15. ESD与EOS的区别
  16. Html5中鼠标经过图片,图片在盒子内部实现放大效果。
  17. pat basic 1082 射击比赛
  18. 文本框内容改变的绑定事件
  19. 2018.11.4 东华杯(骇极) REVERSE What's it wp
  20. winscp如何连接安卓手机_通过winscp连接路由器

热门文章

  1. 自学转行3年经验,终入职阿里!
  2. 笔记本HDMI1.4 1080p下外接高刷显示器的实现方法之一
  3. 如何让图片变成全景图,vr全景图怎么拍摄和制作
  4. AG9300|Type-C 转VGA数据转换器解决方案
  5. 实验二 实现中点分割直线段裁剪算法
  6. matlab勾股定理,勾股定理的两个物理证明
  7. 58同城智能推荐系统的演进与实践(转)
  8. Network POJ - 1144
  9. EXCEL设置下拉选项,选项带颜色
  10. EPICS教程1 -- 在Linux/UNIX/DARWIN(MAC)上安装