一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java中處理socket通信過程中粘包的情況

java中處理socket通信過程中粘包的情況

2020-10-29 14:57二十七路公交車 Java教程

本篇文章主要介紹了java中處理socket通信過程中粘包的情況,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

處理粘包程序是客戶端的接受消息線程:

客戶端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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;
            }
          }
          //下面這個(gè)值請注意,一定要取2長度的字節(jié)子數(shù)組作為報(bào)文長度,你懂得
          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ù)端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/chaiqunxing51/article/details/51958242

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人使劲躁女人视频免费 | 欧美艳星kagneyiynn高清 | 国产精品亚洲w码日韩中文 国产精品香蕉在线观看不卡 | 九九九好热在线 | 日本不卡视频免费的 | 2021国产精品露脸在线 | 日韩欧美一区二区三区视频 | 精灵之森高清在线 | 王淑兰李思雨李铁柱乡村小说免费 | 美女主播免费观看 | 国产成人精品免费视频大全五级 | 日韩亚洲人成在线 | 日日综合| 免费观看二十女人一摸是水 | 精品欧美一区二区在线观看欧美熟 | 人人澡人 | 公妇乱淫在线播放免费观看 | 青青草影院在线观看 | 激情小视频网站 | 久久久久久久久人体 | 欧美日韩一区二区三区在线观看 | 国产精品免费网站 | 草草草在线 | 交换年轻夫妇HD中文字幕 | 91国内精品| 大奶妈咪女教师 | 精品欧美一区二区三区四区 | 1024国产精品视频观看 | 欧美一级xxx | 亚洲一区二区三区免费视频 | 亚洲春色综合另类网蜜桃 | 6个老师的尿奴 | 校花在公车上被内射好舒 | 亚洲羞羞裸色私人影院 | 玩逼逼| 暖暖 免费 高清 日本 在线1 | 亚洲精品国产A久久久久久 亚洲精品福利一区二区在线观看 | 国产91在线精品 | 国产精品露脸国语对白手机视频 | 久久精品99国产精品日本 | 日韩一区在线播放 |