Commit 7d11457809debd269185c7d468e17491288167f9

Authored by 钟易宏
1 parent 03b4127d

3 threads: initsocketthread, readthread, heartbeatthread

... ... @@ -43,6 +43,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
43 43 public class SocketService1 extends BaseService {
44 44 private static final String TAG = "BackService1";
45 45 private static final long HEART_BEAT_RATE = 2 * 1000;
  46 + private final long READ_THREAD_DEFAULT_SLEEP_MTIME = 1000;
46 47
47 48 // public static final int USER_OPEN_DOOR_AND_GET_MOVIE = 1703;
48 49 /*
... ... @@ -97,10 +98,11 @@ public class SocketService1 extends BaseService {
97 98 // public String testRoomSn = "R170413034374";
98 99 public String testRoomSn = "c";
99 100
100   - private ReadThread mReadThread;
101   - private Gson gson;
  101 +// private ReadThread mReadThread;
  102 + private Gson gson = new Gson();
102 103
103   - private WeakReference<Socket> mSocket;
  104 +// private WeakReference<Socket> mSocket;
  105 + private Socket socket = null;
104 106 StringBuilder readingMsg = new StringBuilder();
105 107
106 108 // For heart Beat
... ... @@ -109,16 +111,19 @@ public class SocketService1 extends BaseService {
109 111 AtomicBoolean sendRegister = new AtomicBoolean(false);
110 112
111 113 private Runnable heartBeatRunnable = new Runnable() {
  114 + private static final String TAG = "HeartBeatThread";
112 115
113 116 @Override
114 117 public void run() {
115 118 Log.d(TAG, "heart beat");
116 119 mHandler.postDelayed(this, HEART_BEAT_RATE);
117   - boolean isSuccess = sendMsg(new Gson().toJson(new SocketSendMsg().contractHeartBeatMsg(testRoomSn)) + END_SYMBOL);//就发送一个HEART_BEAT_STRING过去 如果发送失败,就重新初始化一个socket
  120 + //就发送一个HEART_BEAT_STRING过去 如果发送失败,就重新初始化一个socket
  121 + boolean isSuccess = sendMsg(new Gson().toJson(
  122 + new SocketSendMsg().contractHeartBeatMsg(testRoomSn)) + END_SYMBOL);
118 123 if (!isSuccess) {
119 124 LogUtils.d(TAG, "heart beat error restart");
120   - clearConnect();
121   - new InitSocketThread().start();
  125 +// clearConnect();
  126 +// new InitSocketThread().start();
122 127 }
123 128 }
124 129 };
... ... @@ -138,7 +143,7 @@ public class SocketService1 extends BaseService {
138 143 }
139 144 };
140 145
141   - private Context context;
  146 + private Context context = this;
142 147
143 148 @Override
144 149 public IBinder onBind(Intent arg0) {
... ... @@ -148,8 +153,8 @@ public class SocketService1 extends BaseService {
148 153 @Override
149 154 public void onCreate() {
150 155 super.onCreate();
151   - gson = new Gson();
152   - context = this;
  156 +// gson = new Gson();
  157 +// context = this;
153 158 LogUtils.d(TAG, "onCreate");
154 159 }
155 160
... ... @@ -193,13 +198,19 @@ public class SocketService1 extends BaseService {
193 198 return super.onStartCommand(intent, flags, startId);
194 199 }
195 200
  201 +// LogUtils.d(TAG, "socket service onCreate");
196 202 new InitSocketThread().start();
197   - LogUtils.d(TAG, "socket service onCreate");
  203 + new ReadThread().start();
  204 + mHandler.post(heartBeatRunnable);
  205 +
198 206 return START_STICKY;
199 207 }
200 208
201 209 ///begin socket operation
202 210 private synchronized void initSocket() throws IOException {//初始化Socket
  211 + if (socket != null && socket.isConnected()) {
  212 + return;
  213 + }
203 214 LogUtils.d(TAG, "serverHost:serverPort:" + serverHost + ":" + serverPort);
204 215 mHandler.post(new Runnable() {
205 216 @Override
... ... @@ -207,21 +218,18 @@ public class SocketService1 extends BaseService {
207 218 CToast.makeText(context, "开始连接服务器", 10 * 1000).show();
208 219 }
209 220 });
210   - Socket so = new Socket(serverHost, serverPort);
211   - mSocket = new WeakReference<>(so);
  221 + socket = new Socket(serverHost, serverPort);
212 222 readingMsg.setLength(0);
213   - mReadThread = new ReadThread();
214   - mReadThread.start();
215 223 }
216 224
217 225 private synchronized boolean sendMsg(String msg) {
218   - if (null == mSocket || null == mSocket.get()) {
  226 + if (socket == null || !socket.isConnected()) {
219 227 return false;
220 228 }
221 229 if (!msg.contains("20025")) {
222 230 LogUtils.d(TAG, "send msg:" + msg);
223 231 }
224   - Socket soc = mSocket.get();
  232 + Socket soc = socket;
225 233 try {
226 234 if (!soc.isClosed() && !soc.isOutputShutdown()) {
227 235 OutputStream os = soc.getOutputStream();
... ... @@ -233,32 +241,28 @@ public class SocketService1 extends BaseService {
233 241 } catch (IOException e) {
234 242 LogUtils.d(TAG, "error" + e.getMessage());
235 243 e.printStackTrace();
  244 + releaseLastSocket();
236 245 return false;
237 246 }
238 247 return true;
239 248 }
240 249
241   -
242 250 private synchronized void releaseLastSocket() {
243 251 try {
244   - if (null != mSocket) {
245   - Socket sk = mSocket.get();
246   - if (!sk.isClosed()) {
247   - sk.close();
248   - }
  252 + if (null != socket) {
  253 + socket.close();
249 254 }
250 255 } catch (IOException e) {
251 256 LogUtils.d(TAG, "error" + e.getMessage());
252 257 e.printStackTrace();
253 258 } finally {
  259 + socket = null;
254 260 readingMsg.setLength(0);
255   - mSocket = null;
256 261 }
257 262 }
258 263
259 264 private synchronized boolean recvMsg(StringBuilder msg) {
260   - Socket socket = mSocket.get();
261   - if (null == socket) {
  265 + if (null == socket || !socket.isConnected()) {
262 266 return false;
263 267 }
264 268 try {
... ... @@ -281,8 +285,10 @@ public class SocketService1 extends BaseService {
281 285 }
282 286 } catch (IOException e) {
283 287 e.printStackTrace();
  288 + releaseLastSocket();
284 289 return false;
285 290 }
  291 +
286 292 return false;
287 293 }
288 294
... ... @@ -294,6 +300,8 @@ public class SocketService1 extends BaseService {
294 300 ///end socket operation
295 301
296 302 class InitSocketThread extends Thread {
  303 + private static final String TAG = "HeartBeatThread";
  304 +
297 305 @Override
298 306 public void run() {
299 307 super.run();
... ... @@ -315,37 +323,64 @@ public class SocketService1 extends BaseService {
315 323
316 324 // Thread to read content from Socket
317 325 class ReadThread extends Thread {
  326 + private final String TAG = "ReadThread";
  327 + private long sleepTime = 0;
318 328
319 329 @Override
320 330 public void run() {
321   - super.run();
322   - if (!sendRegister.get()) {
323   - LogUtils.d(TAG, "send register mes");
324   - SocketSendMsg ssm = new SocketSendMsg().contractRegisterMsg(testRoomSn);
325   - String msg = gson.toJson(ssm) + END_SYMBOL;
326   - if (!sendMsg(msg)) {
327   - clearConnect();
328   - return;
329   - }
330   - LogUtils.d(TAG, "" + msg);
331   - sendRegister.set(true);
332   - }
333   - LogUtils.d(TAG, "send register mes end");
334 331 StringBuilder message = new StringBuilder();
335   - while (recvMsg(message)) {
336   - LogUtils.d(TAG, "recv msg:" + message);
  332 +
  333 + LogUtils.d(TAG, "begin");
  334 +
  335 + while (!isInterrupted()) {
337 336 try {
338   - SocketResponse socketResponse = gson.fromJson(message.toString(),
339   - SocketResponse.class);
  337 + if (!sendRegister.get()) {
  338 + LogUtils.d(TAG, "send register mes");
  339 + SocketSendMsg ssm = new SocketSendMsg().contractRegisterMsg(testRoomSn);
  340 + String msg = gson.toJson(ssm) + END_SYMBOL;
  341 + if (!sendMsg(msg)) {
  342 + Thread.sleep(READ_THREAD_DEFAULT_SLEEP_MTIME);
  343 + continue;
  344 + }
  345 + LogUtils.d(TAG, "" + msg);
  346 + sendRegister.set(true);
  347 + } else {
  348 + LogUtils.d(TAG, "already register");
  349 + }
  350 + } catch (InterruptedException e) {
  351 + continue;
  352 + }
  353 +
  354 + LogUtils.d(TAG, "begin to recv msg");
  355 +
  356 + sleepTime = READ_THREAD_DEFAULT_SLEEP_MTIME;
  357 +recvMsgTag:
  358 + while (recvMsg(message)) {
  359 + sleepTime = sleepTime;
  360 +
  361 + LogUtils.d(TAG, "recv msg:" + message);
  362 + SocketResponse socketResponse;
  363 + try {
  364 + socketResponse = gson.fromJson(message.toString(),
  365 + SocketResponse.class);
  366 + } catch (JsonSyntaxException e) {
  367 + LogUtils.e(TAG, "invalid msg:", message + e.getMessage());
  368 + e.printStackTrace();
  369 + clearConnect();
  370 + break recvMsgTag;
  371 + }
  372 +
340 373 switch (socketResponse.getCode()) {
341 374 case SUCCESS_MESSAGE:
342 375 Log.d(TAG, "SUCCESS_MESSAGE");
343 376 break;
  377 +
344 378 case VERIFY_SUCCESS:
345 379 LogUtils.d(TAG, "VERIFY_SUCCESS");
346 380 mHandler.post(heartBeatRunnable);
347 381 LogUtils.d(TAG, "verify success start heart beat");
348 382 break;
  383 +
349 384 case HEART_BEAT_SUCCESS:
350 385 //每成功5次心跳判定是否启动main activity
351 386 if (++mainChargeCount == 5) {
... ... @@ -358,20 +393,23 @@ public class SocketService1 extends BaseService {
358 393 boolean serviceLaunched = ActivityCollector.getActivity(MainActivity.class) != null;
359 394 Log.d(TAG, "HEART_BEAT_SUCCESS,MainActivity Launched:" + serviceLaunched);
360 395 break;
  396 +
361 397 case HEART_BEAT_ERROR_SYMBOL:
362 398 case ROOM_SN_CONNECTED:
363 399 String msg1 = socketResponse.getCode() == HEART_BEAT_ERROR_SYMBOL ? "HEART_BEAT_ERROR_SYMBOL" : "ROOM_SN_CONNECTED";
364 400 LogUtils.d(TAG, msg1);
365   - clearConnect();
  401 +// clearConnect();
366 402 LogUtils.d(TAG, msg1 + " before:" + +System.currentTimeMillis());
367   - try {
368   - Thread.sleep(10 * 1000);
369   - } catch (InterruptedException e) {
370   - e.printStackTrace();
371   - }
  403 +// try {
  404 +// Thread.sleep(10 * 1000);
  405 +// } catch (InterruptedException e) {
  406 +// e.printStackTrace();
  407 +// }
  408 + sleepTime = 10 * 1000;
372 409 LogUtils.d(TAG, msg1 + " after:" + System.currentTimeMillis());
373   - new InitSocketThread().start();
  410 +// new InitSocketThread().start();
374 411 break;
  412 +
375 413 case RETURN_VERIFY_CODE:
376 414 LogUtils.d(TAG, "RETURN_VERIFY_CODE");
377 415 if (!TextUtils.isEmpty(socketResponse.getData().getVerify())) {
... ... @@ -381,6 +419,7 @@ public class SocketService1 extends BaseService {
381 419 sendMsg(msg);
382 420 }
383 421 break;
  422 +
384 423 case CONTAIN_MESSAGE:
385 424 LogUtils.d(TAG, "CONTAIN_MESSAGE");
386 425 if (socketResponse.getData() != null) {
... ... @@ -438,15 +477,21 @@ public class SocketService1 extends BaseService {
438 477 }
439 478 }
440 479 break;
  480 +
441 481 default:
442 482 LogUtils.d(TAG, "default msg:" + socketResponse.toString());
443 483 }
444   - } catch (JsonSyntaxException e) {
445   - LogUtils.d(TAG, "error" + message + e.getMessage());
446   - e.printStackTrace();
  484 + LogUtils.d(TAG, "recv msg:" + message);
  485 + }
  486 +
  487 + try {
  488 + Thread.sleep(sleepTime);
  489 + } catch (InterruptedException e) {
  490 + continue;
447 491 }
448   - LogUtils.d(TAG, "recv msg:" + message);
449 492 }
  493 +
  494 + LogUtils.d(TAG, "end");
450 495 }
451 496 }
452 497
... ...
Please register or login to post a comment