Java/Kotlin UDP数据报

Java/Kotlin UDP数据报,java,kotlin,udp,decode,datagram,Java,Kotlin,Udp,Decode,Datagram,我有一个非常基本的问题。假设有一个简单的udp客户端,它正在侦听传入的数据报。这些数据报只是字节[],但它们可能包含复杂的信息,如字符串、整数等 是否有任何优雅的方式来解码数据报,比如使用定义数据报内容的结构和C中的联合,而不是使用ByteBuffer一步一步地处理接收到的字节[] 编辑1 好的,现在开始。 我可以构建一个测试项目来进行一些测试。 我想执行的第一个测试是解析最简单的东西。只差一个(int16)。我用的是fbs计划 // Example IDL file for our monst

我有一个非常基本的问题。假设有一个简单的udp客户端,它正在侦听传入的数据报。这些数据报只是字节[],但它们可能包含复杂的信息,如字符串、整数等

是否有任何优雅的方式来解码数据报,比如使用定义数据报内容的结构和C中的联合,而不是使用ByteBuffer一步一步地处理接收到的字节[]

编辑1

好的,现在开始。 我可以构建一个测试项目来进行一些测试。 我想执行的第一个测试是解析最简单的东西。只差一个(int16)。我用的是fbs计划

// Example IDL file for our monster's schema.

namespace UDPdatagram;


table DatContent {
    id:short;
}


root_type DatContent;
我尝试运行的最小代码如下所示:

package controllingFXML

import UDPdatagram.DatContent
import java.nio.ByteBuffer

fun main() {
    // use a short (16 byte int, i.e. 2 byte)
    val byteArray           = ByteArray(2)
    // the test number
    val testShort: Short    = 67
    println("TEST SHORT: $testShort")

    // allocate a byte buffer and add the test short
    val buffer              = ByteBuffer.allocate(byteArray.size)
    buffer.position(0)
    buffer.putShort(testShort)

    // reset the position and verify its content
    buffer.position(0)
    val buffShort           = buffer.short
    println("BUFFER SHORT: $buffShort")

    // reset the position of the buffer again and try to use flatbuffers
    buffer.position(0)
    val content             =  DatContent.getRootAsDatContent(buffer)
    println("PARSED CONTENT: ${content.id()}")
}
不幸的是,在运行代码时,我总是得到以下信息:

Exception in thread "main" java.lang.IndexOutOfBoundsException
    at java.base/java.nio.Buffer.checkIndex(Buffer.java:688)
    at java.base/java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:392)
    at UDPdatagram.DatContent.getRootAsDatContent(DatContent.java:14)
    at UDPdatagram.DatContent.getRootAsDatContent(DatContent.java:13)
    at controllingFXML.AsdfKt.main(asdf.kt:25)
    at controllingFXML.AsdfKt.main(asdf.kt)

我完全迷路了。这里我缺少什么?

Java中没有C中的一对一解决方案。 更重要的是,即使在C语言中,这也不是最好的解决方案,因为数据解释取决于系统的端点


但是FlatBuffers库可能有用。

或者(i)ByteBuffer或者(ii)围绕ByteArrayInputStream的DataInputStream,在这两种情况下都围绕字节数组。或者直接使用DatagramSocketChannel和ByteBuffer用户207421

或者(i)
ByteBuffer
或者(ii)
DataInputStream
围绕一个
ByteArrayInputStream
,在这两种情况下都围绕字节数组。或者直接使用
DatagramSocketChannel
ByteBuffer
。您试图自己填充数据,但也应该使用FlatBuffers。您应该在一端将数据序列化到FlatBuffers,然后在另一端从FlatBuffers反序列化它。我为什么要这样做?如果我通过数据报在网络上获取数据,它只是一个字节[],不一定是用扁平缓冲区构造的。我试图通过直接构建ByteBuffer来“模拟”网络数据。这只是一个测试,这就是平板缓冲器的工作原理。您不能只将short推送到buffer并用flatbuffers解析它,因为flatbuffers使用它自己的数据存储格式。您应该手动解析字节[](使用DataInputStream),或者在两侧使用FlatBuffers进行数据报的数据序列化。好的,谢谢您的澄清。那样的话,我就完全没用了。我只是在寻找一种更有趣的方法来解析字节[]。我通过网络从不使用flatbuffers的源获取数据。好吧,我看了一下,看起来很不错!然而,本教程在某些方面让我感到孤独。在完成计划后,我应该做些什么?我不知道如何使用生成的文件。更准确地说,我将生成的文件夹复制到我的项目中。不幸的是,当我构建它时,它声明了几个错误,例如,它找不到符号“BaseVector”,我在pom.xml中包含了com.google.flatbuffers flatbuffers java version 1.11.1,所以我不明白为什么会有这些错误……它只是没有从包中找到cetrain内容(如BaseVector),而是找到其他内容(如表)。从maven导入的包似乎缺少一些类。这怎么可能?好吧,现在我已经克隆了这个包,并手动将它添加到我的项目中。现在它建立起来了。不知道为什么maven导入没有导入所有内容。