在网上很多新手在开发java TCP Socket 程序时, 都不知道怎么处理,
特别是在数据包粘在一起的时候, 不知道怎么取到完整的数据包, 也不知道从什么地方开始取数据
在Socket开发中最基本工作是: 确定双方交互的报文规范
本方的规范是:
报文开头: EB90EB90
报文格式: 报文头(4byte) + 数据长度(2byte) +类型(2byte) +数据(Nbyte);
报文头长 = 4 + 2 + 2 =8byte
报文长度 = 4 + 2 + 2 + N
报文列子: EB 90 EB 90 00 1A 00 01 05 01 2F 00 68 00 07 2F 00 00 00 00 00 0C 06 13 00 00 00 10 0C 06 13 02 75 16
数据长度为 26, 报文长度: 26 + 8 =34
本报文采用[高字节在前] 组装(详细见 https://blog.csdn.net/guishuanglin/article/details/100974045)
代码如下:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 数据接收线程
* 报文开头: EB90EB90
* 报文格式: 报文头(4byte) + 数据长度(2byte) +类型(2byte) +数据(Nbyte);
* 报文头长 = 4 + 2 + 2 =8byte
* 报文长度 = 4 + 2 + 2 + N
* 报文列子: EB 90 EB 90 00 1A 00 01 05 01 2F 00 68 00 07 2F 00 00 00 00 00 0C 06 13 00 00 00 10 0C 06 13 02 75 16
* 数据长度为 26, 报文长度: 26 + 8 =34
*/
public class ReceiveThread implements Runnable {
private Log logger = LogFactory.getLog(this.getClass());
private DataInputStream inStm = null;
private Socket socket;
private String fn = "数据接收";
public ReceiveThread(Socket socket, DataInputStream inStm) {
this.socket = socket;
this.inStm = inStm;
}
public void run() {
logger.info(fn+", 启动接收线程.");
boolean b =true;
while (b) {
try {