tcp长连接中客户端重连

来源:互联网 发布:淘宝2016开学爆到活动 编辑:程序博客网 时间:2024/05/16 10:30

在tcp长连接时候,客户端重连,需要将原来的资源释放,关闭原来的读取消息的线程,和socket,重新调用心跳线程

如何清理资源:

将超时的心跳线程停止,可以在心跳线程的外面,加上一个while(boolean flag)循环,

将flag置false,将心跳线程停止

停止读取消息的线程,关闭套接字

代码如下:

package cn.erong.socket;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;public class ClientConnectAgain {private final String SOCKET_HOST = "127.0.0.1";private final int SOCKET_PORT = 8888;private Socket mSocket;private DataOutputStream mDataOutputStream;private SocketReadThread mReadThread;private void connectToServer() {         Thread connectThread = new Thread(new Runnable() {             public void run() {                 try {                     mSocket = new Socket();                     mSocket.connect(                             new InetSocketAddress(SOCKET_HOST, SOCKET_PORT));                       mDataOutputStream = new DataOutputStream(                             mSocket.getOutputStream());                                          // 开启线程负责读取服务端数据                     mReadThread = new SocketReadThread();                     mReadThread.start();                                          // 心跳检测,检测socket是否连接  //                   mHandler.postDelayed(mHeartBeatRunnable, HEART_BEAT_RATE);                 } catch (UnknownHostException e) {                     System.out.println("连接失败");                     e.printStackTrace();                 } catch (IOException e) {                 System.out.println("连接失败");                       e.printStackTrace();                 }             }         });         connectThread.start();     }    // 心跳机制      private static final long HEART_BEAT_RATE = 4 * 1000;      private long sendTime = 0L;      private Runnable mHeartBeatRunnable = new Runnable() {            @Override          public void run() {              if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {//每隔4秒检测一次                  boolean isSuccess = sendHeartBeatMsg("");                  if (!isSuccess) {                     System.out.println("连接已断开,正在重连……");  //                    mHandler.removeCallbacks(mHeartBeatRunnable);// 移除线程,重连时保证该线程已停止上次调用时的工作                      mReadThread.release();//释放SocketReadThread线程资源                      releaseLastSocket();                      connectToServer();// 再次调用connectToServer方法,连接服务端                  }              }  //            mHandler.postDelayed(this, HEART_BEAT_RATE);          }      };      /**      * 发送心跳包      *       * @param msg      * @return      */      public boolean sendHeartBeatMsg(String msg) {          if (null == mSocket) {              return false;          }          try {              if (!mSocket.isClosed() && !mSocket.isOutputShutdown()) {                  String message = msg + "\r\n";                  mDataOutputStream.write(message.getBytes());                  mDataOutputStream.flush();                  sendTime = System.currentTimeMillis();              } else {                  return false;              }          } catch (IOException e) {              e.printStackTrace();              return false;          }          return true;      }          class SocketReadThread extends Thread {                private static final String TAG = "SocketThread";          private volatile boolean mStopThread = false;          public void release() {              mStopThread = true;              releaseLastSocket();          }          @Override          public void run() {              DataInputStream mInputStream = null;              try {                  mInputStream = new DataInputStream(mSocket.getInputStream());                 System.out.println("SocketThread running!");                  while (!mStopThread) {                       String resultStr = mInputStream.readUTF();                    System.out.println(resultStr);                 }              } catch (UnknownHostException e) {                  e.printStackTrace();              } catch (IOException e) {                  e.printStackTrace();              } finally {                  try {                      mSocket.close();                  } catch (IOException e) {                      e.printStackTrace();                  }                  if (mInputStream != null) {                      try {                          mInputStream.close();                          mInputStream = null;                      } catch (IOException e) {                          e.printStackTrace();                      }                  }              }         }        }    /**      * 断开连接      *      */         private void releaseLastSocket() {             try {                 if (null != mSocket) {                     if (!mSocket.isClosed()) {                         mSocket.close();                     }                 }                 mSocket = null;             } catch (IOException e) {                 e.printStackTrace();             }         }         }
代码无法运行,只是简单说明下一些思路,转载自

http://blog.csdn.net/u011791526/article/details/53536403

原创粉丝点击