此系列文章拖了N久,有好多人发邮件来询问我第五次的文章为什么没有写,其实非常抱歉,本人学生一个,暑假一直
去公司实习,最近又忙着各种招聘找工作,没有时间好好写,现在抽空把最后一篇补上,水平有限,如过有不对的,请
各位指正~
前四篇文章分别介绍了 “代码结构”,“程序流程”,以及”发送方的处理”,现在就把接收方的处理流程做个介绍;
如上图所示,接收方的操作有三个类:AudioDecoder(负责解码),AudioPlayer(负责播放解码后的音频),
AudioReceiver(负责从服务器接收音频数据包),这三个类的流程在第三篇中有详细的介绍。
1.AudioReceiver代码:
AudioReceiver使用UDP方式从服务端接收音频数据,其过程比较简单,直接上代码:
package xmu.swordbearer.audio.receiver;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import xmu.swordbearer.audio.MyConfig;
import android.util.Log;
public class AudioReceiver implements Runnable {
String LOG = "NET Reciever ";
int port = MyConfig.CLIENT_PORT;// 接收的端口
DatagramSocket socket;
DatagramPacket packet;
boolean isRunning = false;
private byte[] packetBuf = new byte[1024];
private int packetSize = 1024;
/*
* 开始接收数据
*/
public void startRecieving() {
if (socket == null) {
try {
socket = new DatagramSocket(port);
packet = new DatagramPacket(packetBuf, packetSize);
} catch (SocketException e) {
}
}
new Thread(this).start();
}
/*
* 停止接收数据
*/
public void stopRecieving() {
isRunning = false;
}
/*
* 释放资源
*/
private void release() {
if (packet != null) {
packet = null;
}
if (socket != null) {
socket.close();
socket = null;
}
}
public void run() {
// 在接收前,要先启动解码器
AudioDecoder decoder = AudioDecoder.getInstance();
decoder.startDecoding();
isRunning = true;
try {
while (isRunning) {
socket.receive(packet);
// 每接收一个UDP包,就交给解码器,等待解码
decoder.addData(packet.getData(), packet.getLength());
}
} catch (IOE