如何通过网络传输缓冲区列表

时间:2017-10-31 23:37:51

标签: java networking

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

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

1 个答案:

答案 0 :(得分: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()也会构成一个数据报,可能超大。