(java)处理socket通信过程中粘包的情况
来源:互联网 发布:java 线程池 编辑:程序博客网 时间:2024/06/06 12:21
直接上代码吧:
处理粘包程序是客户端的接受消息线程:
客户端:
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 stubnew TestSocketClient().start();}class SendThread extends Thread{private Socket socket;public SendThread(Socket socket){this.socket=socket;}@Overridepublic 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;}@Overridepublic 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(); } } } } }}
0 0
- (java)处理socket通信过程中粘包的情况
- socket 的通信过程
- socket 的通信过程
- socket的通信过程
- socket 的通信过程
- socket 的通信过程
- socket 的通信过程
- socket 的通信过程
- socket通信的过程
- socket 的通信过程
- socket通信之socket的通信过程
- java的socket通信
- Java的Socket通信
- Socket的粘包情况处理
- java socket通信 1v1的通信
- JAVA的网络通信----SOCKET
- Java 的各种Socket通信
- Java简单的socket 通信
- C#对list列表进行随机排序的方法
- angular项目如何分层
- Eclipse 右键 Open declaration 出错
- C++ STL基本容器的使用
- Android四大组件之ContentProvider使用方法
- (java)处理socket通信过程中粘包的情况
- windows Git Bash 无法运行python文件的解决方法
- Swift3的playground中对UI直接测试支持的改变
- 改变Bitmap的大小
- Android 多进程通讯之 AIDL
- rxjava(二)Single与Subject
- fresco--facebook推出的一款强大的android图片处理库
- slf4j-api、slf4j-log4j12、log4j的关系
- 微服务架构的分布式事务问题