Skip to content

Commit 59d8d89

Browse files
author
Deng
committed
fix Server stopListen not disconnect clients. Replace String with byte[] for default msg
1 parent c4aac45 commit 59d8d89

7 files changed

Lines changed: 281 additions & 83 deletions

File tree

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/vilyever/androidsocketclient/MainActivity.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.vilyever.logger.Logger;
88
import com.vilyever.socketclient.SocketClient;
9+
import com.vilyever.socketclient.SocketPacket;
910
import com.vilyever.socketclient.SocketResponsePacket;
1011
import com.vilyever.socketclient.server.SocketServer;
1112
import com.vilyever.socketclient.server.SocketServerClient;
@@ -106,6 +107,25 @@ public void onResponse(SocketClient client, @NonNull SocketResponsePacket respon
106107
}
107108
});
108109

110+
getLocalSocketClient().registerSocketHeartBeatDelegate(new SocketClient.SocketHeartBeatDelegate() {
111+
@Override
112+
public void onHeartBeat(SocketClient socketClient) {
113+
Logger.log("onHeartBeat");
114+
}
115+
});
116+
117+
getLocalSocketClient().registerSocketPollingDelegate(new SocketClient.SocketPollingDelegate() {
118+
@Override
119+
public void onPollingQuery(SocketClient socketClient, SocketResponsePacket pollingQueryPacket) {
120+
Logger.log("onPollingQuery " + pollingQueryPacket.getMessage());
121+
}
122+
123+
@Override
124+
public void onPollingResponse(SocketClient socketClient, SocketResponsePacket pollingResponsePacket) {
125+
Logger.log("onPollingResponse " + pollingResponsePacket.getMessage());
126+
}
127+
});
128+
109129
getLocalSocketClient().connect();
110130

111131
getWindow().getDecorView().postDelayed(new Runnable() {
@@ -118,6 +138,8 @@ public void run() {
118138
catch (UnsupportedEncodingException e) {
119139
e.printStackTrace();
120140
}
141+
142+
getLocalSocketClient().send(SocketPacket.DefaultPollingQueryMessage);
121143
}
122144
}, 5 * 1000);
123145
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.vilyever.socketclient;
2+
3+
import com.vilyever.socketclient.util.BytesWrapper;
4+
5+
import java.nio.charset.Charset;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
/**
10+
* PollingHelper
11+
* AndroidSocketClient <com.vilyever.socketclient>
12+
* Created by vilyever on 2016/4/27.
13+
* Feature:
14+
*/
15+
public class PollingHelper {
16+
final PollingHelper self = this;
17+
18+
19+
/* Constructors */
20+
public PollingHelper(String defaultCharsetName) {
21+
this.defaultCharsetName = defaultCharsetName;
22+
23+
registerQueryResponse(SocketPacket.DefaultPollingQueryMessage, SocketPacket.DefaultPollingResponseMessage);
24+
}
25+
26+
27+
/* Public Methods */
28+
public PollingHelper registerQueryResponse(String query, String response) {
29+
return registerQueryResponse(query, response, getDefaultCharsetName());
30+
}
31+
32+
public PollingHelper registerQueryResponse(String query, String response, String charsetName) {
33+
return registerQueryResponse(query.getBytes(Charset.forName(charsetName)), response.getBytes(Charset.forName(charsetName)));
34+
}
35+
36+
public PollingHelper registerQueryResponse(byte[] query, byte[] response) {
37+
getQueryResponseMap().put(new BytesWrapper(query), new BytesWrapper(response));
38+
return this;
39+
}
40+
41+
public PollingHelper registerQueryResponse(HashMap<BytesWrapper, BytesWrapper> queryResponseMap) {
42+
getQueryResponseMap().putAll(queryResponseMap);
43+
return this;
44+
}
45+
46+
public PollingHelper removeQueryResponse(String query) {
47+
return removeQueryResponse(query, getDefaultCharsetName());
48+
}
49+
50+
public PollingHelper removeQueryResponse(String query, String charsetName) {
51+
return removeQueryResponse(query.getBytes(Charset.forName(charsetName)));
52+
}
53+
54+
public PollingHelper removeQueryResponse(byte[] query) {
55+
getQueryResponseMap().remove(query);
56+
return this;
57+
}
58+
59+
public PollingHelper clear() {
60+
getQueryResponseMap().clear();
61+
return this;
62+
}
63+
64+
public PollingHelper append(PollingHelper pollingHelper) {
65+
registerQueryResponse(pollingHelper.getQueryResponseMap());
66+
return this;
67+
}
68+
69+
public boolean containsQuery(byte[] bytes) {
70+
for (Map.Entry<BytesWrapper, BytesWrapper> entry : getQueryResponseMap().entrySet()) {
71+
if (entry.getKey().equalsBytes(bytes)) {
72+
return true;
73+
}
74+
}
75+
return false;
76+
}
77+
78+
public boolean containsResponse(byte[] bytes) {
79+
for (Map.Entry<BytesWrapper, BytesWrapper> entry : getQueryResponseMap().entrySet()) {
80+
if (entry.getValue().equalsBytes(bytes)) {
81+
return true;
82+
}
83+
}
84+
return false;
85+
}
86+
87+
public byte[] getResponse(byte[] query) {
88+
return getResponse(new BytesWrapper(query)).getBytes();
89+
}
90+
91+
public BytesWrapper getResponse(BytesWrapper bytesWrapper) {
92+
return getQueryResponseMap().get(bytesWrapper);
93+
}
94+
95+
/* Properties */
96+
private final String defaultCharsetName;
97+
public String getDefaultCharsetName() {
98+
return this.defaultCharsetName;
99+
}
100+
101+
private HashMap<BytesWrapper, BytesWrapper> queryResponseMap;
102+
protected HashMap<BytesWrapper, BytesWrapper> getQueryResponseMap() {
103+
if (this.queryResponseMap == null) {
104+
this.queryResponseMap = new HashMap<>();
105+
}
106+
return this.queryResponseMap;
107+
}
108+
109+
/* Overrides */
110+
111+
112+
/* Delegates */
113+
114+
115+
/* Private Methods */
116+
117+
}

socketclient/src/main/java/com/vilyever/socketclient/SocketClient.java

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import java.net.Socket;
2020
import java.nio.charset.Charset;
2121
import java.util.ArrayList;
22-
import java.util.HashMap;
2322
import java.util.Iterator;
24-
import java.util.Map;
2523
import java.util.concurrent.LinkedBlockingQueue;
2624

2725
/**
@@ -46,8 +44,6 @@ public SocketClient(@NonNull String remoteIP, int remotePort, int connectionTime
4644
setRemoteIP(remoteIP);
4745
setRemotePort(remotePort);
4846
setConnectionTimeout(connectionTimeout);
49-
50-
registerQueryResponse(SocketPacket.DefaultPollingQueryMessage, SocketPacket.DefaultPollingResponseMessage);
5147
}
5248

5349
/* Public Methods */
@@ -101,6 +97,15 @@ public void disconnect() {
10197
getUiHandler().sendEmptyMessage(UIHandler.MessageType.Disconnected.what());
10298
}
10399

100+
/**
101+
* 与{@link #send(byte[])} 相同,增加一个别名
102+
* @param data
103+
* @return
104+
*/
105+
public SocketPacket sendBytes(byte[] data) {
106+
return send(data);
107+
}
108+
104109
/**
105110
* @param data
106111
* @return
@@ -109,11 +114,27 @@ public SocketPacket send(byte[] data) {
109114
if (!isConnected()) {
110115
return null;
111116
}
112-
SocketPacket socketPacket = new SocketPacket(data);
117+
SocketPacket socketPacket = new SocketPacket(data, isSupportReadLine());
113118
getSendThread().enqueueSocketPacket(socketPacket);
114119
return socketPacket;
115120
}
116121

122+
/**
123+
* 与{@link #send(String)} 相同,增加一个别名
124+
* @return
125+
*/
126+
public SocketPacket sendString(String message) {
127+
return send(message);
128+
}
129+
130+
/**
131+
* 与{@link #send(String, String)} 相同,增加一个别名
132+
* @return
133+
*/
134+
public SocketPacket sendString(String message, String charsetName) {
135+
return send(message, charsetName);
136+
}
137+
117138
public SocketPacket send(String message) {
118139
return send(message, getCharsetName());
119140
}
@@ -122,7 +143,7 @@ public SocketPacket send(String message, String charsetName) {
122143
return send(message, Charset.forName(charsetName));
123144
}
124145

125-
public SocketPacket send(String message, Charset charset) {
146+
protected SocketPacket send(String message, Charset charset) {
126147
if (!isConnected()) {
127148
return null;
128149
}
@@ -151,29 +172,6 @@ public boolean isConnecting() {
151172
return getState() == State.Connecting;
152173
}
153174

154-
public SocketClient registerQueryResponse(String query, String response) {
155-
return registerQueryResponse(query, response, getCharsetName());
156-
}
157-
158-
public SocketClient registerQueryResponse(String query, String response, String charsetName) {
159-
return registerQueryResponse(query.getBytes(Charset.forName(charsetName)), response.getBytes(Charset.forName(charsetName)));
160-
}
161-
162-
public SocketClient registerQueryResponse(byte[] query, byte[] response) {
163-
getQueryResponseMap().put(query, response);
164-
return this;
165-
}
166-
167-
public SocketClient registerQueryResponse(HashMap<byte[], byte[]> queryResponseMap) {
168-
getQueryResponseMap().putAll(queryResponseMap);
169-
return this;
170-
}
171-
172-
public SocketClient removeQueryResponse(String query) {
173-
getQueryResponseMap().remove(query);
174-
return this;
175-
}
176-
177175
/**
178176
* 注册监听回调
179177
* @param delegate 回调接收者
@@ -406,6 +404,8 @@ public void onFinish() {
406404

407405
/**
408406
* 当前连接状态
407+
* 当设置状态为{@link State#Connected}, 收发线程等初始操作均未启动
408+
* 此状态仅为一个标识
409409
*/
410410
private State state;
411411
protected SocketClient setState(State state) {
@@ -420,14 +420,14 @@ public State getState() {
420420
}
421421

422422
/**
423-
* 自动应答键值对
423+
* 自动应答
424424
*/
425-
private HashMap<byte[], byte[]> queryResponseMap;
426-
protected HashMap<byte[], byte[]> getQueryResponseMap() {
427-
if (this.queryResponseMap == null) {
428-
this.queryResponseMap = new HashMap<byte[], byte[]>();
425+
private PollingHelper pollingHelper;
426+
public PollingHelper getPollingHelper() {
427+
if (this.pollingHelper == null) {
428+
this.pollingHelper = new PollingHelper(getCharsetName());
429429
}
430-
return this.queryResponseMap;
430+
return this.pollingHelper;
431431
}
432432

433433
private ConnectionThread connectionThread;
@@ -511,17 +511,17 @@ protected ArrayList<SocketPollingDelegate> getSocketPollingDelegate() {
511511
return this.socketPollingDelegate;
512512
}
513513
public interface SocketPollingDelegate {
514-
void onPollingQuery(SocketClient socketClient, byte[] pollingQuery);
515-
void onPollingResponse(SocketClient socketClient, byte[] pollingResponse);
514+
void onPollingQuery(SocketClient socketClient, SocketResponsePacket pollingQueryPacket);
515+
void onPollingResponse(SocketClient socketClient, SocketResponsePacket pollingResponsePacket);
516516

517517
class SimpleSocketPollingDelegate implements SocketPollingDelegate {
518518
@Override
519-
public void onPollingQuery(SocketClient socketClient, byte[] pollingQuery) {
519+
public void onPollingQuery(SocketClient socketClient, SocketResponsePacket pollingQueryPacket) {
520520

521521
}
522522

523523
@Override
524-
public void onPollingResponse(SocketClient socketClient, byte[] pollingResponse) {
524+
public void onPollingResponse(SocketClient socketClient, SocketResponsePacket pollingResponsePacket) {
525525

526526
}
527527
}
@@ -593,6 +593,7 @@ protected void onConnected() {
593593

594594
getHearBeatCountDownTimer().start();
595595

596+
596597
ArrayList<SocketDelegate> delegatesCopy =
597598
(ArrayList<SocketDelegate>) getSocketDelegates().clone();
598599
int count = delegatesCopy.size();
@@ -626,15 +627,14 @@ protected void onReceiveResponse(@NonNull SocketResponsePacket responsePacket) {
626627
return;
627628
}
628629

629-
for (Map.Entry<byte[], byte[]> entry : getQueryResponseMap().entrySet()) {
630-
if (responsePacket.isMatch(entry.getKey())) {
631-
onReceivePollingQuery(entry.getKey());
632-
return;
633-
}
634-
if (responsePacket.isMatch(entry.getValue())) {
635-
onReceivePollingResponse(entry.getValue());
636-
return;
637-
}
630+
if (getPollingHelper().containsQuery(responsePacket.getData())) {
631+
onReceivePollingQuery(responsePacket);
632+
return;
633+
}
634+
635+
if (getPollingHelper().containsResponse(responsePacket.getData())) {
636+
onReceivePollingResponse(responsePacket);
637+
return;
638638
}
639639

640640
ArrayList<SocketDelegate> delegatesCopy =
@@ -656,24 +656,24 @@ protected void onReceiveHeartBeat() {
656656
}
657657

658658
@CallSuper
659-
protected void onReceivePollingQuery(byte[] pollingQuery) {
660-
send(getQueryResponseMap().get(pollingQuery));
659+
protected void onReceivePollingQuery(SocketResponsePacket pollingQueryPacket) {
660+
send(getPollingHelper().getResponse(pollingQueryPacket.getData()));
661661

662662
ArrayList<SocketPollingDelegate> delegatesCopy =
663663
(ArrayList<SocketPollingDelegate>) getSocketPollingDelegate().clone();
664664
int count = delegatesCopy.size();
665665
for (int i = 0; i < count; ++i) {
666-
delegatesCopy.get(i).onPollingQuery(this, pollingQuery);
666+
delegatesCopy.get(i).onPollingQuery(this, pollingQueryPacket);
667667
}
668668
}
669669

670-
protected void onReceivePollingResponse(byte[] pollingResponse) {
670+
protected void onReceivePollingResponse(SocketResponsePacket pollingResponsePacket) {
671671

672672
ArrayList<SocketPollingDelegate> delegatesCopy =
673673
(ArrayList<SocketPollingDelegate>) getSocketPollingDelegate().clone();
674674
int count = delegatesCopy.size();
675675
for (int i = 0; i < count; ++i) {
676-
delegatesCopy.get(i).onPollingResponse(this, pollingResponse);
676+
delegatesCopy.get(i).onPollingResponse(this, pollingResponsePacket);
677677
}
678678
}
679679

0 commit comments

Comments
 (0)