Java:如何描述网络数据包?
我是Java新手,通过UDP/TCP使用自己的网络协议编写程序。C语言中有这样一个数据包: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中那样将其转换为结构。您必须自己解析字节数组,例
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();
}