当前位置: 首页 > 知识库问答 >
问题:

通过TCP接收字节数据包

王锐
2023-03-14

我在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");
}
}

有人知道解决方案吗?

共有1个答案

岳浩穰
2023-03-14

看看数字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字符更长。

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

 类似资料:
  • 我正在尝试用snmp V3实现一个简单的NMS。2 api。目标是通过TCP接收SNMP通知。 问题是我只通过UDP接收通知。。。我用SNMP4J API在java中实现了一个代理,但只有通过UDP发送时才起作用。 我已经搜索了一些示例,但我只找到了代理通过UDP向snmp管理器发送陷阱/通知的示例。。。。 我还发现:http://lists.agentpp.org/pipermail/agent

  • 我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到

  • 问题内容: 我要通过TCP / IP编写程序,我应该通过客户端或服务器发送对象,当我想发送或接收字符串但尝试读取对象时,它是正确的: 我收到一个例外: 它指的是这一行: 这是我的服务器代码: 客户端代码: 谁能解释我发生了什么,这个例外是什么,为什么我收到这个例外? 问题答案: 只是摆脱发送和接收布尔值的麻烦。这是多余的。如果在创建连接时遇到问题,则不会创建套接字:而是抛出异常。您会将所有内容与同

  • 问题内容: 我已经用套接字卡住了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接, 它将与新客户端一起打开theard,并等待消息。 一旦消息发送到服务器,客户端将收到响应,该部分正在正常工作。 客户专区的一部分: 服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”。 如果客户端将请求命令“列表”,它将运行以下命令:有一个“服务器/客户端”,它正在发送请求并接收一

  • 我需要通过以太网协议将以太网数据包从一个设备发送到另一个设备。经过一番研究,我决定使用TCP\IP协议。我创建了相互通信的TCP服务器和TCP客户端。为此,我使用了TcpClient和TcpListener类。它工作正常,但我有一些问题: < li >我需要检查收到的消息中的CRC,并与监听方手动计算的CRC进行比较。我该怎么做?我如何从收到的消息中获取CRC?我得到的只是我从客户那里发来的一个准

  • 但是我这里有一些问题,有人能检查一下我的代码吗: 现在我想要接收字节到字节数组中&然后把它转换成int数组(但是数据应该在int数组中)........