gpt4 book ai didi

java - Java中如何从网络包数据中取出数据

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:21 26 4
gpt4 key购买 nike

在 C 中,如果您有某种类型的数据包,您通常做的是定义一些结构并将 char * 转换为指向该结构的指针。在此之后,您可以直接编程访问网络数据包中的所有数据字段。像这样:

struct rdp_header {
int version;
char serverId[20];
};

当您收到网络数据包时,您可以快速执行以下操作:

char * packet;
// receive packet
rdp_header * pckt = (rdp_header * packet);
printf("Servername : %20.20s\n", pckt.serverId);

这项技术非常适合基于 UDP 的协议(protocol),并且允许使用非常少的代码非常快速和非常有效地解析和发送数据包,以及简单的错误处理(只需检查数据包的长度)。在 Java 中是否有等效的、同样快速的方法来做同样的事情?还是您被迫使用基于流的技术?

最佳答案

将您的数据包读入一个字节数组,然后从中提取您想要的位和字节。

这是一个示例,没有异常处理:

DatagramSocket s = new DatagramSocket(port);
DatagramPacket p;
byte buffer[] = new byte[4096];

while (true) {
p = new DatagramPacket(buffer, buffer.length);
s.receive(p);

// your packet is now in buffer[];
int version = buffer[0] << 24 + buffer[1] << 16 + buffer[2] < 8 + buffer[3];
byte[] serverId = new byte[20];
System.arraycopy(buffer, 4, serverId, 0, 20);

// and process the rest
}

在实践中,您最终可能会使用辅助函数以网络 顺序从字节数组中提取数据字段,或者作为Tom。在评论中指出,您可以使用 ByteArrayInputStream(),您可以从中构造一个 DataInputStream(),它具有从流中读取结构化数据的方法:

...

while (true) {
p = new DatagramPacket(buffer, buffer.length);
s.receive(p);

ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
DataInput di = new DataInputStream(bais);

int version = di.readInt();
byte[] serverId = new byte[20];
di.readFully(serverId);
...
}

关于java - Java中如何从网络包数据中取出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/436989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com