日期:2014-05-20  浏览次数:20844 次

linux+tomcat socket长链接出现java.net.SocketException: Broken pipe
本帖最后由 qiangcai 于 2013-01-29 18:50:28 编辑
      各位大神好:

     情况是这样的,我建一个socket客户后然后往服务端发送业务数据,发送数据持续10分钟的时候就出现了这个异常java.net.SocketException: Broken pipe。这个程序在Windows上能正常运行,但是移到linux下就出现该问题了。首先我发送的数据量不是很大,也就一分钟10条数据,一条数据就几KB吧,而且中间不会停顿。苦恼了N多天,今天决定把该问题贴出来请各位帮忙看看!以下为我客户端的业务代码。


public class SendSource implements Runnable {

private static KedaLogger log = KedaLogger.getLogger(SendSource.class);
private InputStream is = null;
private OutputStream os = null;
private Socket socket;

public SendSource(Socket socket) {
this.socket = socket;
}

public void run() {

VehicleMessage vehicleMessage = null;

try { 

this.socket.setSoTimeout(10000);//设置超时时间
while (true) {

if (!this.socket.isConnected() || this.socket.isClosed()) {
log.error("socket连接对象已经关闭");
socket = StratSendUnit.createDsuCon();
} else {

vehicleMessage = StratSendUnit.getBatchVehicleInfo();
if (vehicleMessage != null) {
String msgVehicle = vehicleMessage.getVehicleXml();
String bigPictureUrl = vehicleMessage.getBigPictureUrl();
String smallPictureUrl = vehicleMessage.getSmallPictureUrl();

// /获取字符串的字节数组
byte[] msgBytes = msgVehicle.getBytes("utf-8");

if (is == null || os == null) {
is = socket.getInputStream();
os = socket.getOutputStream();
}

// (1)组装报文头,并且写入输出流
os.write(getMsgHead(msgBytes.length));
// (2)组装报文长度信息,并且写入输入流
os.write(getMsgLength(msgBytes.length));
// (3)发送报文内容
os.write(msgBytes);

// 全景大图 2:前车闪光后全景图片
if (!StringUtils.isEmpty(bigPictureUrl)) {
String[] bigPicture = bigPictureUrl.split(",");
for (int i = 0; i < bigPicture.length; i++) {

String url = bigPicture[i];
byte[] imageUrlByte = url.getBytes();
// (4)FIU发送图片数据类型信息
if (i == 0) {
      os.write(ByteUtil.int2bytes(2));// 2前闪光灯后全景图片
} else {
      os.write(ByteUtil.int2bytes(11));// 11违法图片
}
// (5)发送数据长度信息
os.write(getMsgLength(imageUrlByte.length));
// (6)发送影像数据内容
os.write(imageUrlByte);

}
}
/*
* 如果涉及传入多张图片注意传输XML里面fileCount的大小 。车牌小图片3:前车车牌号码小图片
 */

if (!StringUtils.isEmpty(smallPictureUrl)) {
byte[] imageUrlByte = smallPictureUrl.getBytes();
// (4)FIU发送图片数据类型信息
os.write(ByteUtil.int2bytes(3));
// (5)发送数据长度信息
os.write(getMsgLength(imageUrlByte.length));
// (6)发送影像数据内容
os.write(imageUrlByte);
 }

os.flush();
// /跳过和丢弃此输入流中数据的 n 个字节
is.skip(is.available());

}

}

Thread.sleep(CodeValue.sendSourceRate);
}

} catch (Exception e) {
try {
this.is.close();
this.os.close();
this.socket.close();
this.is=null;
this.os=null;
this.socket=null;