高手解贴!----从未遇到过的Socket通讯怪问题!
状况:
两台机通过Socket通讯,服务端每秒发送一心跳信号(4byte标志位+4byte包长度位+16byte全部0xaa),客户端通过下面的程序接收并解包。
问题:
程序运行后前15次能够正常接收到心跳信号的数据并能正确解包,但第16次开始就不能接收到数据,程序中的iLength值为-1,以后都不能接收到数据。请问这是为什么?
部分代码:
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: www.gdie.com</p>
*
* @author java_dd@yahoo.com.cn
* @version 1.0
*/
public class SocketReceiveFromCP extends Thread {
private static Logger log = Logger.getLogger(SocketReceiveFromCP.class);
static Socket server;
public boolean bStop = false;
/**
* 从车牌接收数据
*/
public void run() {
try {
server = new Socket(InetAddress.getByAddress(Business.getIpv4("CPIP")), 33002);
DataInputStream in = new DataInputStream(server.getInputStream());
// BufferedInputStream in = new BufferedInputStream(server.getInputStream());
// BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
// BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream(), "ISO8859-1"));
// String str = "";
int iPackageFlag = 0x55aa55aa;
int iheart = 0;
while (true) {
byte[] bSmallBuf = new byte[16];
//取前面8个字节
int iLength = in.read(bSmallBuf, 0, 8);
String sTemp = new String(bSmallBuf);
log.info("包:" + sTemp + "--------iLength:" + iLength );
if (iLength < 8) {
continue;
}
//取数据包起始标志
int iRead = getPackageFlag(bSmallBuf);
//如果是包起始
if (iRead == iPackageFlag) {
//得到包长度
int iPackageLength = getPackageLength(bSmallBuf);
if (iPackageLength == 16) { //如果是心跳信号
in.read(bSmallBuf, 0, 16);
log.info("心跳" + iheart++);
continue;
}
//是车牌数据包信号
byte[] bBuf = new byte[4194304];
int iReadLength = iPackageLength;
//读完整个数据包的所有数据
while (iReadLength > 0) {
int iThisReadLength = in.read(bBuf, 0, iReadLength);
iReadLength -= iThisReadLength;
}
:
:
}
}
}
}
}