


Share example code for handling sticky packets during socket communication in Java
This article mainly introduces the situation of sticky packets in the process of socket communication in java. It has certain reference value. Interested friends can refer to it.
I have learned about processing in java in the past two days. The situation of packet sticking during socket communication is very important, so I will add a few notes today.
The sticky package processing program is the client's message receiving thread:
Client:
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(); } } }
Server:
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(); } } } } } }
[Related recommendations]
1. An example tutorial on communication between java and php through socket
2. Detailed explanation of WebSocket and example code in HTML5
3. Common socket error summary
4. Summary of the difference between socket and http
The above is the detailed content of Share example code for handling sticky packets during socket communication in Java. For more information, please follow other related articles on the PHP Chinese website!

Java'splatformindependencemeansdeveloperscanwritecodeonceandrunitonanydevicewithoutrecompiling.ThisisachievedthroughtheJavaVirtualMachine(JVM),whichtranslatesbytecodeintomachine-specificinstructions,allowinguniversalcompatibilityacrossplatforms.Howev

To set up the JVM, you need to follow the following steps: 1) Download and install the JDK, 2) Set environment variables, 3) Verify the installation, 4) Set the IDE, 5) Test the runner program. Setting up a JVM is not just about making it work, it also involves optimizing memory allocation, garbage collection, performance tuning, and error handling to ensure optimal operation.

ToensureJavaplatformindependence,followthesesteps:1)CompileandrunyourapplicationonmultipleplatformsusingdifferentOSandJVMversions.2)UtilizeCI/CDpipelineslikeJenkinsorGitHubActionsforautomatedcross-platformtesting.3)Usecross-platformtestingframeworkss

Javastandsoutinmoderndevelopmentduetoitsrobustfeatureslikelambdaexpressions,streams,andenhancedconcurrencysupport.1)Lambdaexpressionssimplifyfunctionalprogramming,makingcodemoreconciseandreadable.2)Streamsenableefficientdataprocessingwithoperationsli

The core features of Java include platform independence, object-oriented design and a rich standard library. 1) Object-oriented design makes the code more flexible and maintainable through polymorphic features. 2) The garbage collection mechanism liberates the memory management burden of developers, but it needs to be optimized to avoid performance problems. 3) The standard library provides powerful tools from collections to networks, but data structures should be selected carefully to keep the code concise.

Yes,Javacanruneverywhereduetoits"WriteOnce,RunAnywhere"philosophy.1)Javacodeiscompiledintoplatform-independentbytecode.2)TheJavaVirtualMachine(JVM)interpretsorcompilesthisbytecodeintomachine-specificinstructionsatruntime,allowingthesameJava

JDKincludestoolsfordevelopingandcompilingJavacode,whileJVMrunsthecompiledbytecode.1)JDKcontainsJRE,compiler,andutilities.2)JVMmanagesbytecodeexecutionandsupports"writeonce,runanywhere."3)UseJDKfordevelopmentandJREforrunningapplications.

Key features of Java include: 1) object-oriented design, 2) platform independence, 3) garbage collection mechanism, 4) rich libraries and frameworks, 5) concurrency support, 6) exception handling, 7) continuous evolution. These features of Java make it a powerful tool for developing efficient and maintainable software.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Dreamweaver CS6
Visual web development tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Notepad++7.3.1
Easy-to-use and free code editor

Zend Studio 13.0.1
Powerful PHP integrated development environment
