这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添加一点小笔记。
处理粘包程序是客户端的接受消息线程:
客户端:
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 ; } } //下面这个值请注意,一定要取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(); } } } |
服务端:
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(); } } } } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/chaiqunxing51/article/details/51958242