使用C#中的Avro框架通过UDP客户端发送流obj

本文关键字:客户端 obj UDP 中的 Avro 框架 使用 | 更新日期: 2023-09-27 18:24:04

我正在尝试通过UDP套接字发送流。"SendTo"采用byte[]缓冲区参数。如果我有一个流对象(缓冲区),不知道该怎么做。请帮忙!谢谢ByteBufferOutputStream似乎没有将流转换为字节的功能。

ByteBufferOutputStream buffer = new ByteBufferOutputStream();
Avro.IO.Encoder ej = new BinaryEncoder(buffer);
ej.WriteInt(Convert.ToInt32(testEvent["schemaId"]));
var dwrd = new DefaultWriter(schema);
dwrd.Write<GenericRecord>(testEvent, ej);
buffer.Flush();
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp);
IPAddress serverAddr = IPAddress.Parse("192.168.1.1");
IPEndPoint endPoint = new IPEndPoint(serverAddr, 2190);
clientSocket.SendTo(buffer, endPoint);

使用C#中的Avro框架通过UDP客户端发送流obj

实际上是这样。ByteBufferOutputStream有一个名为GetBufferList的方法,该方法返回System.IO.MemoryStream的IEnumerable。您可以获取这些MemoryStream,并将它们连接到一个缓冲区,用一个整数头指定有多少个流(用X表示),然后再加X个整数,指定有序流的长度,再加上流本身。

您可以通过UDP将整个缓冲区发送到服务器,在那里它将重建流,并且使用ByteBufferInputStream(来自Avro),后者有一个接受它们的构造函数。