這兩天學習了java中處理socket通信過程中粘包的情況,而且很重要,所以,今天添加一點小筆記。

創(chuàng)新互聯(lián)公司服務(wù)項目包括茌平網(wǎng)站建設(shè)、茌平網(wǎng)站制作、茌平網(wǎng)頁制作以及茌平網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,茌平網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到茌平省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
處理粘包程序是客戶端的接受消息線程:
客戶端:
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長度的字節(jié)子數(shù)組作為報文長度,你懂得
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();
}
}
}
服務(wù)端:
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();
}
}
}
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
標題名稱:java中處理socket通信過程中粘包的情況
文章來源:http://chinadenli.net/article6/jpciig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、靜態(tài)網(wǎng)站、網(wǎng)站營銷、、ChatGPT、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)