Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何描述网络数据包?_Java_Networking - Fatal编程技术网

Java:如何描述网络数据包?

Java:如何描述网络数据包?,java,networking,Java,Networking,我是Java新手,通过UDP/TCP使用自己的网络协议编写程序。C语言中有这样一个数据包: struct test_package { u32 cmd; u32 args; u32 flags; }; 以UDP为例,我从DatagramPacket得到的是字节数据[]。如何将其转换为包结构 如果在C中,如果没有对齐限制,它只是(struct test_package*)数据 谢谢Java不提供直接内存访问,因此您不能像在C中那样将其转换为结构。您必须自己解析字节数组,例

我是Java新手,通过UDP/TCP使用自己的网络协议编写程序。C语言中有这样一个数据包:

struct test_package {
    u32 cmd;
    u32 args;
    u32 flags;
};
以UDP为例,我从DatagramPacket得到的是字节数据[]。如何将其转换为包结构

如果在C中,如果没有对齐限制,它只是
(struct test_package*)数据


谢谢

Java不提供直接内存访问,因此您不能像在C中那样将其转换为结构。您必须自己解析字节数组,例如:

byte data[] = ...;
DataInput input = new DataInputStream(new ByteArrayInputStream(data));

int cmd = input.readInt();
int args = input.readInt();
int flags = input.readInt();
假设你有一门课:

public class TestPackage implements Serializable
{
   long cmd;
   long args;
   long flags;
}
可以通过序列化将其作为字节[]存储在DatagramPackage中。然后在另一端,您可以获取字节[],并将其反序列化回TestPackage的确切实例

(以下是序列化/反序列化的外观)


这是可行的,但它假设两端都运行一个基于Java的客户端。这看起来像是一种序列化/反序列化的通用方法。但是它能保证byte[]数据布局与struct test_package相同吗?@user1550330不,布局不会相同,就像卡萨布兰卡所说的,它假设另一端也是Java,并且你在来回传递类。看起来我必须为每种包实现这样的代码。它看起来有点多余,我必须这样做。而且我不确定拥有这样的内存拷贝是如何保持效率的。@user1550330:是的,它有点冗余,但Java实际上是面向对象的代码,而不是像这样的低级数据。如果你也关心效率,也许Java不是正确的解决方案。你需要知道,将C结构直接连接到电线上是非常糟糕的工程。它介绍了对编译器的依赖关系、编译器版本、周围的#实际杂注、当天编译时使用的编译器选项。。。不推荐。您必须定义一个网络字节协议,并用编程语言编写所有必须编写的内容以正确实现该协议。Java在正确操作时的所谓低效与C在错误操作时的明显效率是不可比的。
public static byte[] serialize(Object object) {
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(out);
   oos.writeObject(object);
   return out.toByteArray();
}

public static Object deserialize(byte[] datagramData) {
   ByteArrayInputStream in = new ByteArrayInputStream(datagramData);
   ObjectInputStream ois = new ObjectInputStream(in);
   return ois.readObject();
}