Java UDP发送 - 逐个接收数据包

时间:2014-02-18 22:00:09

标签: java sockets networking udp

我正在尝试通过UDP发送和接收一些音频编码数据,并且很困惑。

首先,我在C#和node.js之前完成了UDP send-receive,并且逐个接收数据包非常简单直接,但它在Java中有所不同,让我感到困惑。

每个编码数据大小约为360-380 bytes

我需要通过UDP将此编码数据作为数据包发送到远程(或 localhost )。

UDP接收器应接收编码数据作为数据包并处理解码。

这是一个简短的例子来说明我的所作所为。

编码器和UDP发件人

  ds = new DatagramSocket(localPort);
  //a Thread with While loop----------
  Log.d("AudioEncoder", outData.length + " bytes encoded");
  //The encoded data size is about 370 bytes for each

  packet = new DatagramPacket(outData, outData.length,
  InetAddress.getByName("127.0.0.1"), localPort);
  ds.send(packet);

UDP接收器和解码器

ds = new DatagramSocket(localPort);
byte[] buffer2 = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer2, buffer2.length);

while (isPlaying)
{
        ds.receive(packet); 
        Log.d("UDP-receiver",  buffer2.length + " bytes received");

        //do Decoding on buffer2
        //..........
}

基本上,每个发送和接收的数据包(编码字节数据)大小约为360-380字节。

然后,我理解Java Datagram,为特定的字节大小(例如512 or 1024创建一个缓冲区(我不知道在这种情况下最优化的是什么大小,在这些日子里)

如果我设置DatagramPacket大小1024 bytes,则大小为360-380 bytes的数据包将在缓冲区中汇集两次,然后将原始的2个数据包连接在一起,然后作为单字节数组?

如果我设置DatagramPacket大小512 bytes,那么大小为360-380 bytes的数据包会在缓冲区中汇集两次,然后由于缓冲区大小溢出,单个数据包到达被刷过来处理?

同样,至少,接收器可以逐个接收数据包,然后为每个数据包进行处理,但事情看起来很复杂。

请指导我。感谢。

1 个答案:

答案 0 :(得分:0)

  

如果我将DatagramPacket的大小设置为1024字节,那么大小为360-380字节的数据包会在缓冲区中汇集两次,然后将原来的2个数据包连接在一起然后作为单字节数组处理?

没有。您收到两个单独的数据包。

  

如果我将DatagramPacket的大小设置为512字节,则大小为360-380字节的数据包将两次汇总到缓冲区中

没有

  

然后因为它溢出了缓冲区大小,所以到达的单个数据包被刷过来处理?

我不知道'刷过'是什么意思,但这一切都不会发生。您收到两个单独的数据包。