int dataLen = 0; //报文前六个字节所标识的完整报文长度
int readLen = 0; //已成功读取的字节数
int needDataLen = 0; //剩余需要读取的报文长度,即报文正文部分的长度
byte[] buffer = new byte[6]; //假设报文协议为:前6个字节表示报文长度(不足6位左补0),第7个字节开始为报文正文
while(readLen < 6){
readLen += in.read(buffer, readLen, 6-readLen);
}
dataLen = Integer.parseInt(new String(buffer));
System.out.println("dataLen=" + dataLen);
byte[] datas = new byte[dataLen];
System.arraycopy(buffer, 0, datas, 0, 6);
needDataLen = dataLen - 6;
while(needDataLen > 0){
readLen = in.read(datas, dataLen-needDataLen, needDataLen);
System.out.println("needDataLen=" + needDataLen + " readLen=" + readLen);
needDataLen = needDataLen - readLen;
}
System.out.println("Receive request " + new String(datas, "UTF-8"));
OutputStream out = socket.getOutputStream();
out.write("The server status is opening".getBytes("UTF-8"));
//out.flush();
} catch (IOException e) {
//当服务端正在进行发送数据的操作时,如果客户端断开了连接,那么服务器会抛出一个IOException的子类SocketException异常
//java.net.SocketException: Connection reset by peer
//这只是服务器与单个客户端通信时遇到了异常,这种异常应该被捕获,使得服务器能够继续与其它客户端通信
e.printStackTrace();
} finally {
if(null != socket){
try {
//与一个客户通信结束后要关闭Socket,此时socket的输出流和输入流也都会被关闭
//若先后调用shutdownInput()和shutdownOutput()方法,也仅关闭了输入流和输出流,并不等价于调用close()
//通信结束后,仍然要调用Socket.close()方法,因为只有该方法才会释放Socket所占用的资源,如占用的本地端口等
socket.close();
} catch (IOException e) {
//ignore the exception
}
}
}
}
}
}