重新连接 socket
来源:互联网 发布:英文软件汉化 编辑:程序博客网 时间:2024/06/06 20:32
最近在做基于socket 长连接的东西,需要用到重新连接socket。从网上学习了,在这边转发。
package com.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 定时重连socket
*
* 扩展应用:socket虽然表面上连着,但实际上可能已经断了,那么在某些条件的触发下(比如60分钟没获得socket数据),重新连接socket服务
*
* @author jch
*
*/
public class ReconnectSocket extends Thread {
private Socket socketClient;
private String host = "localhost";
private String port = "1111";
private BufferedReader reader;
private boolean flag_forEver = false;// 保证线程存活的标志
private boolean flag_connectedSocket = true;// socket连接是否成功的标识
private boolean flag_forReConnectSocket = false;// socket重新连接时用到的暂停标识
private ListenForSocket lfs;// socket重连监视线程
public ReconnectSocket() {
try {
connectSocket();
lfs = new ListenForSocket();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 连接socket
*
* @throws Exception
*/
private synchronized void connectSocket() throws Exception {
try {// 关闭socket
if (socketClient != null) {
try {
socketClient.shutdownInput();
socketClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// socket重新连接
socketClient = new Socket(host, Integer.parseInt(port));
socketClient.setKeepAlive(true);
socketClient.setSoLinger(true, 0);
socketClient.setReceiveBufferSize(81920);
reader = new BufferedReader(new InputStreamReader(socketClient
.getInputStream()));
flag_connectedSocket = true;
} catch (Exception e) {
new Exception("连接socket出现问题").printStackTrace();
flag_connectedSocket = false;
}
}
/**
* 重新连接socket
*
*/
public void reconnectSocket() {
try {
flag_forReConnectSocket = false;
connectSocket();
flag_forReConnectSocket = true;
} catch (Exception e) {
}
}
public void start() {
lfs.start();
flag_forEver = true;
flag_forReConnectSocket = true;
super.start();
}
public void cancel() {
lfs.cancel();
flag_forEver = false;
flag_forReConnectSocket = false;
}
public void run() {
while (flag_forEver) {// 保证线程存活的标志
try {
if (!flag_connectedSocket) {// 判断socket是否已经连上了,保证连上socket
connectSocket();
sleep(1000);
continue;
}
String str = "";
while (flag_forReConnectSocket) {// socket定时重接时用到的暂停标识
try {
if ((str = reader.readLine()) != null) {
System.out.println(str);
}
} catch (java.net.SocketException socket_e) {
// 不作处理--重连socket时可能抛出的错误
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 定时重连socket的线程
*
* @author jch
*
*/
class ListenForSocket extends Thread {
private boolean flag = false;
public void start() {
flag = true;
super.start();
}
public void cancel() {
flag = false;
}
public void run() {
while (flag) {
try {
// 当socket已经连上了才作重连,本身就没连上的情况,有另外的机制在重连
// 根据不同的业务需要增加重连的其他限制条件,如果不加其他限制的条件的话,socket将定时重连
if (flag_connectedSocket && true) {
reconnectSocket();
}
sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new ReconnectSocket().start();
}
}
- 重新连接 socket
- socket(php)(短连接)(循环发count次,但是每次都得重新连接,会自动断开)整理版本2
- adoconnection重新连接问题
- MySQL自动重新连接
- MySQL自动重新连接
- MySQL自动重新连接
- socket 连接
- Socket连接
- Socket连接
- hibernate自动重新连接数据库
- activemq 重新连接的机制
- 重新配置CentOS网络连接
- SSH断开后重新连接
- activemq 重新连接的机制
- C# ADSL重新连接、拨号
- netty心跳和重新连接
- PHP socket 连接 Socket server
- Delphi socket连接.net Socket
- 一、Qt Creator的安装和hello world程序的编写
- Shell脚本调试技术
- 矩阵求导
- QString 中文问题
- The Matrix Reference Manual
- 重新连接 socket
- 魅族M9 初步体验感受,O(∩_∩)O哈哈哈~虽然推出一年才买,但是赶上了1699RMB 的好价格也不错
- 高性能Web服务器Nginx的配置与部署研究(6)核心模块之主模块的测试常用指令
- 浅谈C++联编机制
- tcpdump一些参数意义
- 让VS2008为ExtJS提供智能提示
- 今天晚上有泡汤了。。不能再看csdn论坛了,看了==白看,还不如学习呢。
- 李老师这件事给我的反思
- linq子查询