Commit 7d11457809debd269185c7d468e17491288167f9

Authored by 钟易宏
1 parent 03b4127d

3 threads: initsocketthread, readthread, heartbeatthread

@@ -43,6 +43,7 @@ import java.util.concurrent.atomic.AtomicBoolean; @@ -43,6 +43,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
43 public class SocketService1 extends BaseService { 43 public class SocketService1 extends BaseService {
44 private static final String TAG = "BackService1"; 44 private static final String TAG = "BackService1";
45 private static final long HEART_BEAT_RATE = 2 * 1000; 45 private static final long HEART_BEAT_RATE = 2 * 1000;
  46 + private final long READ_THREAD_DEFAULT_SLEEP_MTIME = 1000;
46 47
47 // public static final int USER_OPEN_DOOR_AND_GET_MOVIE = 1703; 48 // public static final int USER_OPEN_DOOR_AND_GET_MOVIE = 1703;
48 /* 49 /*
@@ -97,10 +98,11 @@ public class SocketService1 extends BaseService { @@ -97,10 +98,11 @@ public class SocketService1 extends BaseService {
97 // public String testRoomSn = "R170413034374"; 98 // public String testRoomSn = "R170413034374";
98 public String testRoomSn = "c"; 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 StringBuilder readingMsg = new StringBuilder(); 106 StringBuilder readingMsg = new StringBuilder();
105 107
106 // For heart Beat 108 // For heart Beat
@@ -109,16 +111,19 @@ public class SocketService1 extends BaseService { @@ -109,16 +111,19 @@ public class SocketService1 extends BaseService {
109 AtomicBoolean sendRegister = new AtomicBoolean(false); 111 AtomicBoolean sendRegister = new AtomicBoolean(false);
110 112
111 private Runnable heartBeatRunnable = new Runnable() { 113 private Runnable heartBeatRunnable = new Runnable() {
  114 + private static final String TAG = "HeartBeatThread";
112 115
113 @Override 116 @Override
114 public void run() { 117 public void run() {
115 Log.d(TAG, "heart beat"); 118 Log.d(TAG, "heart beat");
116 mHandler.postDelayed(this, HEART_BEAT_RATE); 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 if (!isSuccess) { 123 if (!isSuccess) {
119 LogUtils.d(TAG, "heart beat error restart"); 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,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 @Override 148 @Override
144 public IBinder onBind(Intent arg0) { 149 public IBinder onBind(Intent arg0) {
@@ -148,8 +153,8 @@ public class SocketService1 extends BaseService { @@ -148,8 +153,8 @@ public class SocketService1 extends BaseService {
148 @Override 153 @Override
149 public void onCreate() { 154 public void onCreate() {
150 super.onCreate(); 155 super.onCreate();
151 - gson = new Gson();  
152 - context = this; 156 +// gson = new Gson();
  157 +// context = this;
153 LogUtils.d(TAG, "onCreate"); 158 LogUtils.d(TAG, "onCreate");
154 } 159 }
155 160
@@ -193,13 +198,19 @@ public class SocketService1 extends BaseService { @@ -193,13 +198,19 @@ public class SocketService1 extends BaseService {
193 return super.onStartCommand(intent, flags, startId); 198 return super.onStartCommand(intent, flags, startId);
194 } 199 }
195 200
  201 +// LogUtils.d(TAG, "socket service onCreate");
196 new InitSocketThread().start(); 202 new InitSocketThread().start();
197 - LogUtils.d(TAG, "socket service onCreate"); 203 + new ReadThread().start();
  204 + mHandler.post(heartBeatRunnable);
  205 +
198 return START_STICKY; 206 return START_STICKY;
199 } 207 }
200 208
201 ///begin socket operation 209 ///begin socket operation
202 private synchronized void initSocket() throws IOException {//初始化Socket 210 private synchronized void initSocket() throws IOException {//初始化Socket
  211 + if (socket != null && socket.isConnected()) {
  212 + return;
  213 + }
203 LogUtils.d(TAG, "serverHost:serverPort:" + serverHost + ":" + serverPort); 214 LogUtils.d(TAG, "serverHost:serverPort:" + serverHost + ":" + serverPort);
204 mHandler.post(new Runnable() { 215 mHandler.post(new Runnable() {
205 @Override 216 @Override
@@ -207,21 +218,18 @@ public class SocketService1 extends BaseService { @@ -207,21 +218,18 @@ public class SocketService1 extends BaseService {
207 CToast.makeText(context, "开始连接服务器", 10 * 1000).show(); 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 readingMsg.setLength(0); 222 readingMsg.setLength(0);
213 - mReadThread = new ReadThread();  
214 - mReadThread.start();  
215 } 223 }
216 224
217 private synchronized boolean sendMsg(String msg) { 225 private synchronized boolean sendMsg(String msg) {
218 - if (null == mSocket || null == mSocket.get()) { 226 + if (socket == null || !socket.isConnected()) {
219 return false; 227 return false;
220 } 228 }
221 if (!msg.contains("20025")) { 229 if (!msg.contains("20025")) {
222 LogUtils.d(TAG, "send msg:" + msg); 230 LogUtils.d(TAG, "send msg:" + msg);
223 } 231 }
224 - Socket soc = mSocket.get(); 232 + Socket soc = socket;
225 try { 233 try {
226 if (!soc.isClosed() && !soc.isOutputShutdown()) { 234 if (!soc.isClosed() && !soc.isOutputShutdown()) {
227 OutputStream os = soc.getOutputStream(); 235 OutputStream os = soc.getOutputStream();
@@ -233,32 +241,28 @@ public class SocketService1 extends BaseService { @@ -233,32 +241,28 @@ public class SocketService1 extends BaseService {
233 } catch (IOException e) { 241 } catch (IOException e) {
234 LogUtils.d(TAG, "error" + e.getMessage()); 242 LogUtils.d(TAG, "error" + e.getMessage());
235 e.printStackTrace(); 243 e.printStackTrace();
  244 + releaseLastSocket();
236 return false; 245 return false;
237 } 246 }
238 return true; 247 return true;
239 } 248 }
240 249
241 -  
242 private synchronized void releaseLastSocket() { 250 private synchronized void releaseLastSocket() {
243 try { 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 } catch (IOException e) { 255 } catch (IOException e) {
251 LogUtils.d(TAG, "error" + e.getMessage()); 256 LogUtils.d(TAG, "error" + e.getMessage());
252 e.printStackTrace(); 257 e.printStackTrace();
253 } finally { 258 } finally {
  259 + socket = null;
254 readingMsg.setLength(0); 260 readingMsg.setLength(0);
255 - mSocket = null;  
256 } 261 }
257 } 262 }
258 263
259 private synchronized boolean recvMsg(StringBuilder msg) { 264 private synchronized boolean recvMsg(StringBuilder msg) {
260 - Socket socket = mSocket.get();  
261 - if (null == socket) { 265 + if (null == socket || !socket.isConnected()) {
262 return false; 266 return false;
263 } 267 }
264 try { 268 try {
@@ -281,8 +285,10 @@ public class SocketService1 extends BaseService { @@ -281,8 +285,10 @@ public class SocketService1 extends BaseService {
281 } 285 }
282 } catch (IOException e) { 286 } catch (IOException e) {
283 e.printStackTrace(); 287 e.printStackTrace();
  288 + releaseLastSocket();
284 return false; 289 return false;
285 } 290 }
  291 +
286 return false; 292 return false;
287 } 293 }
288 294
@@ -294,6 +300,8 @@ public class SocketService1 extends BaseService { @@ -294,6 +300,8 @@ public class SocketService1 extends BaseService {
294 ///end socket operation 300 ///end socket operation
295 301
296 class InitSocketThread extends Thread { 302 class InitSocketThread extends Thread {
  303 + private static final String TAG = "HeartBeatThread";
  304 +
297 @Override 305 @Override
298 public void run() { 306 public void run() {
299 super.run(); 307 super.run();
@@ -315,37 +323,64 @@ public class SocketService1 extends BaseService { @@ -315,37 +323,64 @@ public class SocketService1 extends BaseService {
315 323
316 // Thread to read content from Socket 324 // Thread to read content from Socket
317 class ReadThread extends Thread { 325 class ReadThread extends Thread {
  326 + private final String TAG = "ReadThread";
  327 + private long sleepTime = 0;
318 328
319 @Override 329 @Override
320 public void run() { 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 StringBuilder message = new StringBuilder(); 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 try { 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 switch (socketResponse.getCode()) { 373 switch (socketResponse.getCode()) {
341 case SUCCESS_MESSAGE: 374 case SUCCESS_MESSAGE:
342 Log.d(TAG, "SUCCESS_MESSAGE"); 375 Log.d(TAG, "SUCCESS_MESSAGE");
343 break; 376 break;
  377 +
344 case VERIFY_SUCCESS: 378 case VERIFY_SUCCESS:
345 LogUtils.d(TAG, "VERIFY_SUCCESS"); 379 LogUtils.d(TAG, "VERIFY_SUCCESS");
346 mHandler.post(heartBeatRunnable); 380 mHandler.post(heartBeatRunnable);
347 LogUtils.d(TAG, "verify success start heart beat"); 381 LogUtils.d(TAG, "verify success start heart beat");
348 break; 382 break;
  383 +
349 case HEART_BEAT_SUCCESS: 384 case HEART_BEAT_SUCCESS:
350 //每成功5次心跳判定是否启动main activity 385 //每成功5次心跳判定是否启动main activity
351 if (++mainChargeCount == 5) { 386 if (++mainChargeCount == 5) {
@@ -358,20 +393,23 @@ public class SocketService1 extends BaseService { @@ -358,20 +393,23 @@ public class SocketService1 extends BaseService {
358 boolean serviceLaunched = ActivityCollector.getActivity(MainActivity.class) != null; 393 boolean serviceLaunched = ActivityCollector.getActivity(MainActivity.class) != null;
359 Log.d(TAG, "HEART_BEAT_SUCCESS,MainActivity Launched:" + serviceLaunched); 394 Log.d(TAG, "HEART_BEAT_SUCCESS,MainActivity Launched:" + serviceLaunched);
360 break; 395 break;
  396 +
361 case HEART_BEAT_ERROR_SYMBOL: 397 case HEART_BEAT_ERROR_SYMBOL:
362 case ROOM_SN_CONNECTED: 398 case ROOM_SN_CONNECTED:
363 String msg1 = socketResponse.getCode() == HEART_BEAT_ERROR_SYMBOL ? "HEART_BEAT_ERROR_SYMBOL" : "ROOM_SN_CONNECTED"; 399 String msg1 = socketResponse.getCode() == HEART_BEAT_ERROR_SYMBOL ? "HEART_BEAT_ERROR_SYMBOL" : "ROOM_SN_CONNECTED";
364 LogUtils.d(TAG, msg1); 400 LogUtils.d(TAG, msg1);
365 - clearConnect(); 401 +// clearConnect();
366 LogUtils.d(TAG, msg1 + " before:" + +System.currentTimeMillis()); 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 LogUtils.d(TAG, msg1 + " after:" + System.currentTimeMillis()); 409 LogUtils.d(TAG, msg1 + " after:" + System.currentTimeMillis());
373 - new InitSocketThread().start(); 410 +// new InitSocketThread().start();
374 break; 411 break;
  412 +
375 case RETURN_VERIFY_CODE: 413 case RETURN_VERIFY_CODE:
376 LogUtils.d(TAG, "RETURN_VERIFY_CODE"); 414 LogUtils.d(TAG, "RETURN_VERIFY_CODE");
377 if (!TextUtils.isEmpty(socketResponse.getData().getVerify())) { 415 if (!TextUtils.isEmpty(socketResponse.getData().getVerify())) {
@@ -381,6 +419,7 @@ public class SocketService1 extends BaseService { @@ -381,6 +419,7 @@ public class SocketService1 extends BaseService {
381 sendMsg(msg); 419 sendMsg(msg);
382 } 420 }
383 break; 421 break;
  422 +
384 case CONTAIN_MESSAGE: 423 case CONTAIN_MESSAGE:
385 LogUtils.d(TAG, "CONTAIN_MESSAGE"); 424 LogUtils.d(TAG, "CONTAIN_MESSAGE");
386 if (socketResponse.getData() != null) { 425 if (socketResponse.getData() != null) {
@@ -438,15 +477,21 @@ public class SocketService1 extends BaseService { @@ -438,15 +477,21 @@ public class SocketService1 extends BaseService {
438 } 477 }
439 } 478 }
440 break; 479 break;
  480 +
441 default: 481 default:
442 LogUtils.d(TAG, "default msg:" + socketResponse.toString()); 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