【问题标题】:Send a stream obj through UDP client with Avro framework in C#在 C# 中使用 Avro 框架通过 UDP 客户端发送流 obj
【发布时间】:2014-09-23 21:38:16
【问题描述】:

我正在尝试通过 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# sockets udp avro


    【解决方案1】:

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

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

    【讨论】:

    • List bf = buffer.GetBufferList(); foreach (内存流 bs in bf) { byte[] bsf; bsf = bs.ToArray(); udpClient.Send(bsf, bsf.Length); }
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多