Wifi直连(p2p)一对多音频传输

本文详细介绍了使用WiFi直连(P2P)构建的一对多音频播放系统,系统由服务器和多个客户端组成,服务器作为群主,客户端通过搜索连接。通信采用NIO实现非阻塞socket,解决粘包拆包问题。数据包包含包类型、长度和数据,音频数据以PCM形式传输。服务器端包含ConnectIntentService、DecoderCallback等模块,客户端通过ConnectRunnable接收和发送信息。系统还涉及到了WifiP2P的事件监听和处理。主要技术包括NIO、SocketChannel、SynchronousQueue等。

系统由一台播放器(服务器)和多台接收器(客户端)构成一个wifi直连的群组,服务器是群主(GO),客户端是组员(GC)。使用Wifi直连(p2p)构造一对多的系统是很方便实现的。
系统构成请参见图:wifi_p2p_一对多数据流程
wifi_p2p_一对多数据流程

上图只画出了音频数据的流程,对于服务器与客户端的文字信息交互没有表示,这部分内容看一下代码就明白了。
为了确保服务器作为群主(GO)角色出现在群组中,服务器启动时立即主动创立群组。
客户端启动后通过搜索功能发现服务器,并与之建立连接,客户端可以有多个。
通信系统采用NIO实现非阻塞的socket通信,一来有较好性能,二来避免了多用户复杂线程处理。

NIO系统的处理要点

NIO不同于传统的阻塞式socket通信方式,无法使用功能强大的ObjectOutputStream和ObjectInputStream,将对象以数据流方式发送或接收。
因此必须自己实现传输数据的打包和解包。
本系统传输的数据有两类,文字数据和音频数据。文字数据用于向对方发送消息,音频数据以PCM形式传送声音。

客户端向服务器发送的只有文字数据,直接使用charset.decode解码获得String。

为了便于NIO传输,服务器发出的两种数据都使用如下相同格式的数据包:

  • 包类型 1个字节,用以区分文字数据和音频数据。
  • 包长度 4个字节,用一个整数表示数据包的长度。
  • 数据包,长度不等的文字数据或音频数据。

解决NIO的粘包拆包问题

粘包拆包问题的发生是NIO数据收发缓冲机制造成的,如果数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值