读书人

求教高人有关java Socket连接的有关

发布时间: 2011-12-15 23:41:24 作者: rapoo

求教高人,有关java Socket连接的问题,长连接无法保持
我的客户端需要与一个服务器进行通讯,保持长连接,不知道服务器为何种类型,服务器只提供IP地址和端口号,我的客户端要经常向服务器发送数据,定期还要接受服务器发来的命令,要求我的客户端具有当连接断开的时候自动重连的功能,现在的问题是,我的客户端在和服务器建立连接之后,时间长了,连接会消失,我的客户端运行在solaris系统下,比如说服务器监听的端口是7010,那么我运行netstat -a | grep 7010,则什么也看不到了,而建立连接时可以看到状态是established的,可能的原因是服务器重启或者关机造成的,但是我的重新连接的机制没有发挥作用,而我在局域网测试,当服务器关机重启,或者断开连接,重新监听,我的客户端是可以重新连接上的,我采用的检测连接状态的办法是捕获输入流的异常,如果输入流抛出异常就关闭socket,然后重新连接,程序如下:高手看看,为什么当服务器不在局域网的时候,这种重新连接的机制不起作用?

public final class NafClient implements MsgDef {
public Socket tonaf = null;// 连接服务器的socket

public String nafip;// 服务器的IP

public int port;// 服务器的port

public int bprimary;// 该client连接的是否是服务器

public PrintWriter out;// 用于输出

public BufferedReader in;

public NafProc proc = null;

public ConfigData cfgData = null;

public int nafType;

/***************************************************************************
* 构造函数
*
* @param ip
* @param i
* @param j
* @param proc
*/
public NafClient(String ip, int i, int j, int type, NafProc proc) {
this.nafip = ip;
this.port = i;
this.bprimary = j;
this.cfgData = ConfigData.Instance();
this.nafType = type;
this.proc = proc;
new ClientLinkHolder().start();
}

/***************************************************************************
* 连接服务器
*/
public final boolean connectToNaf() {
try {
tonaf = new Socket(nafip, port);
out = new PrintWriter(tonaf.getOutputStream());
in = new BufferedReader(new InputStreamReader(tonaf
.getInputStream()));
proc.onLinkConnectOk(this);
DMSG.info( "connected to naf! ");
return true;
} catch (UnknownHostException e) {
return false;
} catch (Exception e) {
DMSG.info( "error when connect to naf " + nafip + ": ", e);
return false;
}
}

/***************************************************************************
* 向服务器发送告警
*/
public final synchronized void sendAlarm(String alarm) {
out.print(alarm);
out.flush();
}

/***************************************************************************
* 判断与服务器的连接状态
*/
public final synchronized boolean isConnected() {
if (this.tonaf == null)
return false;
if (this.tonaf.isConnected() == true)
return true;
else
return false;
}

/***************************************************************************
* 如果没有连接通知NafProc
*/
public final void isNotConnected() {
proc.onLinkDisConnect(this);
}

/***************************************************************************
* 内部类,NafClient的保持连接线程


*/
public final class ClientLinkHolder extends Thread {
/***********************************************************************
* 从收到的数据中解析出同步请求
*
* @param req
*/
public String solveRecvData(char[] req) {
String data = String.copyValueOf(req);
int index1 = 0, index2 = 0;
index1 = data.indexOf(cfgData.NAFSyncReq);
index2 = data.lastIndexOf(cfgData.NAFSyncEndFlag);
String str = null;
if (index1 != -1)
if (index2 != -1) {
str = data.substring(index1, index2);
}
return str;
}

public void run() {
while (true) {
if (!isConnected()) {
if (connectToNaf() == false) {
try {
Thread.sleep(10000);
} catch (Exception e) {
}
}
} else {
while (true) {
try {
char[] req = new char[SYNCBUFFERSIZE];
req[SYNCBUFFERSIZE - 1] = '\0 ';
in.read(req);
String cmd = null;
cmd = solveRecvData(req);
if (cmd != null) {
DMSG.info( "receive resend command! " + cmd);
proc.onResendReq(req);
}
} catch (Exception e) {
DMSG.info( "lose connection to naf " + nafip + ": ",e);
isNotConnected();
try {
in.close();
in = null;
tonaf.close();
tonaf = null;
} catch (IOException e1) {
}
break;
}
}
}
}
}
}

/***************************************************************************
*
* @return
*/
public NafProc getProc() {
return proc;
}

/***************************************************************************
*
* @param proc
*/
public void setProc(NafProc proc) {
this.proc = proc;
}

private final static DebugPrn DMSG = new DebugPrn(NafClient.class.getName());
}

[解决办法]
可以试试新建一个socket链接的方式去检测现有的socket是否connet

读书人网 >J2SE开发

热点推荐