|
发表于 2015-10-10 10:34:21
|
显示全部楼层
- //Socket连接进程(加入状态机实现Socket长连接和断线重连)(PS: 此代码对NetAssist.exe在WIN7下无效)
- class Client_ConnectThread extends Thread {
- Message msg = new Message();
- @Override
- public void run() {
- while(true){
- //状态0: 初始化
- if(socket_state == 0){
- socket_state = 1;
- socket_connect_flag = false;
- Log.i("TcpClient", "Init");
- }
- //状态1: 连接服务器
- else if(socket_state == 1){
- try {
- //实例化对象并连接到服务器
- clientSocket = new Socket("192.168.1.112", 8888);
- //clientSocket.setSoTimeout(1000);
- socket_state = 2;
- Log.i("TcpClient", "Connect");
- } catch (UnknownHostException e1) {
- socket_state = 0;
- Log.i("TcpClient", "UnknownHost");
- e1.printStackTrace();
- } catch (IOException e1) {
- socket_state = 0;
- Log.i("TcpClient", "IOException");
- e1.printStackTrace();
- }
- }
- //状态2: 检测是否连接上, 如果连接上, 开启接收线程
- else if(socket_state == 2){
- if (clientSocket.isConnected()) {
- socket_connect_flag = true;
- socket_state = 3;
- msg.what = 1;
- msgHandler.sendMessage(msg);
- //开启接收线程
- mReceiveThread = new ReceiveThread(clientSocket);
- mReceiveThread.start();
- }
- else{
- socket_connect_flag = false;
- socket_state = 0;
- msg.what = 2;
- msgHandler.sendMessage(msg);
- }
- }
- //状态3: 发送心跳报文, 同时挂起线程
- else if(socket_state == 3){
- try {
- clientSocket.sendUrgentData(0);
- socket_state = 3;
- Log.i("TcpClient", "sendUrgentData");
- //挂起线程, 休眠10s
- try {
- Thread.sleep(10000);
- } catch (InterruptedException e1)
- {
- e1.printStackTrace();
- }
- } catch (IOException e) {
- e.printStackTrace();
- socket_state = 4;
- Log.i("TcpClient", "sendUrgentData error");
- //挂起线程, 休眠1ms
- try {
- Thread.sleep(1);
- } catch (InterruptedException e1)
- {
- e1.printStackTrace();
- }
- }
- }
- //状态4: 发送心跳报文有异常, 跳转到状态0, 重新连接
- else if(socket_state == 4){
- socket_state = 0;
- try {
- clientSocket.close();
- } catch (UnknownHostException e1) {
- e1.printStackTrace();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- }
复制代码
发心跳报文, 抛出异常就重连 |
|