Java/Kotlin UDP 数据报

Java/Kotlin UDP datagram

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

是否有任何优雅的方法来解码数据报,例如使用定义数据报内容的结构和 C 中的联合,而不是逐步处理接收到的字节[],例如字节缓冲区?

编辑 1

好的,现在试试 FlatBuffers。 我可以构建一个测试项目来玩一下。 我想要执行的第一个测试是解析最简单的东西。只有一个短(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) DataInputStream 环绕 ByteArrayInputStream,在这两种情况下都环绕字节数组。或者直接将 DatagramSocketChannel 与 ByteBuffer 一起使用。 – 用户 207421