【问题标题】:How to transfer a list of buffers over a network如何通过网络传输缓冲区列表
【发布时间】:2017-11-01 12:22:55
【问题描述】:

我有一个运行两个线程的 Java 网络应用程序,一个用于捕获、编码和发送音频,另一个用于接收、解码和播放音频。我用来编码音频的方法返回一个List<ByteBuffer>。我要使用的解码方法将List<ByteBuffer> 作为参数,因此我需要能够在通过网络发送数据后重建列表。

我遇到的问题是我无法弄清楚如何正确地通过网络发送所有数据而不会损坏。我相信我受到网络编程知识的限制,所以我正在寻求帮助。我尝试了几种不同的方法(DatagramSockets/数据包、流、SocketChannel 等),但我未能成功实现我的目标。对我需要使用什么网络传输协议没有任何要求,因此任何设置都可以。如何通过网络发送缓冲区列表,以便在接收线程中重建它?

【问题讨论】:

  • 你最后一次尝试的代码是什么?

标签: java networking


【解决方案1】:

你要找的是GatheringByteChannel.write(ByteBuffer[], ...),由SocketChannelDatagramSocketChannelFileChannel实现:

ByteBuffer[] bbs = list.toArray(new ByteBuffer[0]);
for (ByteBuffer bb : bbs)
    bb.flip(); // assuming this hasn't already been done
long count = channel.write(bbs);
for (ByteBuffer bb : bbs)
    bb.compact();

此时ByteBuffers 的部分或全部应该是空的,最好是全部。如果不是,你必须是非阻塞模式,所以在频道上选择OP_WRITE,当你得到它时重复上面的操作。

但是您将无法在接收器处准确重建此列表。数据将作为流发送。即使您使用 UDP,write() 也会构成单个数据报,可能会过大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多