Commit 7d11457809debd269185c7d468e17491288167f9
1 parent
03b4127d
3 threads: initsocketthread, readthread, heartbeatthread
Showing
1 changed file
with
98 additions
and
53 deletions
| @@ -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