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
阅读全文
0 0
- tcp长连接中客户端重连
- TCP/IP 长连接 心跳 重连 重发 线程
- 在客户端重定向
- Netty4 Tcp长连接、断开重连、心跳监测、Msgpack编码解码
- TCP socket 长连接
- TCP长连接
- android tcp 长连接
- TCP长连接机制
- TCP长连接短连接
- TCP长连接短连接
- TCP长连接、短连接
- TCP长连接,短连接
- TCP短连接长连接
- TCP长连接、短连接
- TCP 长连接 短连接
- tcp连接断连处理
- tcp连接断连处理
- 如果服务端重启,那么客户端的长连接会怎么样
- Linux常用的命令
- BootStrap
- Spring MVC的Controller统一异常处理:HandlerExceptionResolver
- spring Boot webx
- git删除远程仓库中的文件
- tcp长连接中客户端重连
- Retrofit(okhttp)的动态代理
- python3 Serial 串口助手的接收读取数据
- 详解Nginx虚拟主机配置中server_name的具体写法
- perl urlencode
- Ubuntu16.04卸载其他版本的opencv并安装opencv3.2.0+opencv contrib3.2.0
- 【第五届蓝桥杯】小朋友排队
- Kettle 命令行使用说明
- EventBus3.0