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 | 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