Java 通过TCP接收字节数据包

Java 通过TCP接收字节数据包,java,tcp,Java,Tcp,我在JAVA中通过TCP接收字节数据包时遇到一些问题。 我的TCPServer类发送207字节的数据包。当我发送一个数据包时,程序在控制台中显示“读取207字节数据包”,并停止。下一个数据包继续执行,显示“多重测量”和 “读取1868767867字节数据包。”。之后,接收将永远停止。我不知道它为什么接收1868767867字节。我在wireshark中检查它,服务器总是发送207字节 这是我的TCPClient类: public class TCPClient extends Thread {

我在JAVA中通过TCP接收字节数据包时遇到一些问题。 我的TCPServer类发送207字节的数据包。当我发送一个数据包时,程序在控制台中显示“读取207字节数据包”,并停止。下一个数据包继续执行,显示“多重测量”和 “读取1868767867字节数据包。”。之后,接收将永远停止。我不知道它为什么接收1868767867字节。我在wireshark中检查它,服务器总是发送207字节

这是我的TCPClient类:

public class TCPClient extends Thread {

private ServerSocket serverSocket; 
private Socket connectionSocket;
private InputStream inputStream;
private DataInputStream dataInputStream;


public TCPClient() throws IOException {
    try {
        serverSocket = new ServerSocket(Config.TCP_PORT);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {

    try {
        connectionSocket = serverSocket.accept();
        inputStream = connectionSocket.getInputStream();
        dataInputStream = new DataInputStream(inputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
    while(true) {
        try {
            JsonObject json = getJsonFromTcp();
            if (json != null) {
                    String command = json.getAsJsonPrimitive("command").getAsString();
                    if(command.equals("multipleMeasurement")) {
                        executeMultipleMeasurement();
                    }
                }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private JsonObject getJsonFromTcp() throws IOException {    

    byte[] buff = new byte[4];
    for(int i = 0; i < 4; i++) {
        buff[i] = dataInputStream.readByte();
    }

    int len = (((buff[3] & 0xff) << 24) | ((buff[2] & 0xff) << 16) | ((buff[1] & 0xff) << 8) | (buff[0] & 0xff));

    if(len > 0) {
        System.out.println("Read " + len + " byte packet.");
        byte[] data = new byte[len];
        dataInputStream.readFully(data);
        String jsonString = new String(data, "UTF-8");
        JsonParser jsonParser = new JsonParser();
        JsonObject json = jsonParser.parse(jsonString).getAsJsonObject();
        return json;
    }
    return null;
}

private void executeMultipleMeasurement() {
    System.out.println("Multiple Measurement");
}
}
公共类TCPClient扩展线程{
私有服务器套接字服务器套接字;
专用插座连接插座;
私有输入流输入流;
私有DataInputStream DataInputStream;
公共TCPClient()引发IOException{
试一试{
serverSocket=新的serverSocket(Config.TCP\u端口);
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
公开募捐{
试一试{
connectionSocket=serverSocket.accept();
inputStream=connectionSocket.getInputStream();
dataInputStream=新的dataInputStream(inputStream);
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
JsonObject json=getJsonFromTcp();
if(json!=null){
String command=json.getAsJsonPrimitive(“command”).getAsString();
if(命令等于(“多重测量”)){
executeMultipleMeasurement();
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
私有JsonObject getJsonFromTcp()引发IOException{
字节[]buff=新字节[4];
对于(int i=0;i<4;i++){
buff[i]=dataInputStream.readByte();
}

int len=((buff[3]&0xff)查看数字1868767867,其字节为

"%c%c%c%c" % (0x7b,0x22,0x63,0x6f)
'{"co'
因此,您可以读取下一条消息的前四个字节作为消息的长度。如果声称服务器每次只发送207个字节,最有可能的解释是服务器包含长度前缀的长度(4个字节)根据预期的协议,读取(长度-4)字节作为数据包主体可能是合适的

// Account for the length of the header
len -= 4;

if(len > 0) {
    System.out.println("Read " + len + " byte packet.");
    byte[] data = new byte[len];
    dataInputStream.readFully(data);
第二种可能性是,服务器正在测量字符串中的字符数,然后将该长度用作它将发送的utf-8转换字节缓冲区的长度,包括一些导致结果缓冲区变长的非ascii字符

如果看不到服务器代码,就不可能确定这里发生了什么