首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java BufferedReader 长时间连接read不出东西来,该如何解决

2012-01-14 
java BufferedReader 长时间连接read不出东西来RT. 代码如下:package com.jinshuoimport java.io.Buffere

java BufferedReader 长时间连接read不出东西来
RT. 代码如下:

package com.jinshuo;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.Arrays;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class ClientServer {

private static final Log log = LogFactory.getLog(ClientServer.class);

public static void main(String[] args) {
if(args.length < 3 || args.length > 4){
log.error("参数不合法:" + Arrays.asList(args) + " 程序终止!");
return;
}

log.info("采集程序开始运行:");
log.info("命令参数:" + Arrays.asList(args));
String addrString = args[0];
String portString = args[1];
String timeoutString = args[2];
String sleepString = null;
if(args.length > 3){
sleepString = args[3];
}

Integer port = 0;
try {
port = Integer.decode(portString).intValue();
} catch (Exception e) {
log.error("端口无法转换成数字:" + portString);
log.error("程序终止!");
return;
}

Integer timeout = 10000;
try {
timeout = Integer.decode(timeoutString).intValue();
} catch (Exception e) {
log.error("超时时间无法转换成数字:" + timeoutString + " 使用默认值:" + timeout);
}

Long sleep = 10000L;
if(StringUtils.isEmpty(sleepString)){
log.info("重建连接间隔使用默认值:" + sleep);
}else{
try {
sleep = Long.decode(sleepString).longValue();
} catch (Exception e) {
log.error("重建连接间隔无法转换成数字:" + sleepString + " 使用默认值:" + sleep);
}
}

FaultBufferProcess processThread = new FaultBufferProcess();
BufferedInputStream bufInputStream = null;
BufferedReader reader = null;
String tempString = "";
Socket s = null;
while(true){
while(s == null){
try {
s = new Socket(addrString, port);
s.setReuseAddress(true);
s.setSoTimeout(timeout);
log.info("连接建立成功!");
} catch (Exception e) {
log.error("建立连接失败!" + Math.round(sleep/1000) + "秒钟后尝试重新连接。");
try {
Thread.sleep(sleep);
} catch (InterruptedException ee) {
// TODO Auto-generated catch block
}
}
}
try {
if ((bufInputStream == null) || (reader == null)) {
bufInputStream = new BufferedInputStream(s.getInputStream());
reader = new BufferedReader(new InputStreamReader(bufInputStream, "GBK"));
log.info("创建读取流成功!");
}
while ((tempString = reader.readLine()) != null)
processThread.bufferFault(tempString);
} catch (SocketTimeoutException e) {
// TODO: handle exception
log.info("未发现可读内容!");try {
Thread.sleep(sleep-timeout);
} catch (InterruptedException ee) {
// TODO Auto-generated catch block
}
} catch (IOException e1) {
// TODO: handle exception
s = null;
reader = null;
bufInputStream = null;
log.error("连接出现异常!" + Math.round(sleep/1000) + "秒钟后尝试重新连接。" , e1);
try {
Thread.sleep(sleep);
} catch (InterruptedException ee) {
// TODO Auto-generated catch block
}
}
}
}
}



package com.jinshuo;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class FaultBufferProcess {
private static final Log log = LogFactory.getLog(FaultBufferProcess.class);
public static List<String> sbf = new ArrayList<String>();
public StringBuffer tsb = new StringBuffer();

public void bufferFault(String buffer) {
log.info("解析数据:" + buffer);
try {
buffer = buffer.trim();
if (StringUtils.isBlank(buffer)) {
return;
}
if ("<SYNCBEGIN>".equals(buffer.toUpperCase())) {
buffer = "FaultFlag = NewAlarm";
} else if ("<HEARTBEAT>".equals(buffer.toUpperCase())) {
buffer = "FaultFlag = HeartBeat";
} else if ("<NEWALARM>".equals(buffer.toUpperCase())) {
buffer = "FaultFlag = NewAlarm";
} else if ("<CLEARALARM>".equals(buffer.toUpperCase())) {
buffer = "FaultFlag = ClearAlarm";
}
if (buffer.toUpperCase().contains("END>")) {
String fault = this.tsb.toString();
fault = StringUtils.substringBeforeLast(fault, "\r\n");
if(fault.toUpperCase().contains("HEARTBEAT")){
log.info("接收到心跳包:\r\n" + fault);
this.tsb = new StringBuffer();
return;
}
if (fault.contains("FaultFlag")) {
sbf.add(fault);
log.info("接收到告警:\r\n" + fault);
}
this.tsb = new StringBuffer();
return;
}
this.tsb.append(buffer + "\r\n");
} catch (Exception e) {
log.error("解析过程中出现异常!", e);
}
}
}




只能连续读取大概2、3个小时,然后不报任何异常,直接就log.info("未发现可读内容!");了
有没有哪为大侠熟悉流和socket的,指点指点,帮忙看看这段代码有没有什么问题,为什么只能读一段时间,然后就读不出内容了。

各位大侠在上,小弟拜谢!

[解决办法]
没有可读的内容,自然没数据可读了。比如,你某次多读了些内容,下次自然就会少读了,累计之后,自然有一次什么也读不了, 这时整个读操作就会阻塞掉。
读操作阻塞之后,时间久了,就会出现sockettimeoutException了
你必须要保证有数据可读

热点排行