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

本篇文章主要介绍了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();

}

}

}

}

}

}

【相关推荐】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值