直播源码中的主播PK功能是如何实现的

  [复制链接]
查看: 2521|回复: 1
发表于 2019-10-11 17:37:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
直播行业为赢得更广泛用户的青睐,自然要不断开发更有趣的玩法、模式,在直播源码中加入主播PK功能就是一种提高直播互动性、激发用户好胜心的方法,一方面这种方法可以吸引更多用户观看,增加主播的曝光率,另一方面它又能激发用户的购买欲,增加平台和主播的收入。
PK功能可以使用当下十分流行的Socket.IO为基础来实现。Socket.I O 是一个面向实时 web 应用的 JavaScript 库。它使服务器和客户端之间实时双向的通信成为可能。它由两个部分组成:客户端库和一个面向Node.js的服务端库。像Node.js一样,它也是事件驱动的。并且它有一个优势,它会自动选择合适的双向通信协议。我们充分利用了socket.io的优势,实现了对直播源码中PK功能流程的控制。
首先,对Socket.IO的App客户端进行初始化设置,连接服务端(基础代码如下):
  1. <p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  2. mso-font-kerning:1.0000pt;">try {</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  3. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  4. mso-font-kerning:1.0000pt;">    IO.Options option = new IO.Options();</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  5. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  6. mso-font-kerning:1.0000pt;">    option.forceNew = true;</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  7. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  8. mso-font-kerning:1.0000pt;">    option.reconnection = true;</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  9. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  10. mso-font-kerning:1.0000pt;">    option.reconnectionDelay = 2000;</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  11. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  12. mso-font-kerning:1.0000pt;">    mSocket = IO.socket(AppConfig.getInstance().getSocketServer(), option);</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  13. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  14. mso-font-kerning:1.0000pt;">    mSocketHandler = new SocketHandler();</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  15. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  16. mso-font-kerning:1.0000pt;">} catch (Exception e) {</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  17. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  18. mso-font-kerning:1.0000pt;">    e.printStackTrace();</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  19. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  20. mso-font-kerning:1.0000pt;">    L.e(TAG, "socket异常--->" + e.getMessage());</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  21. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  22. mso-font-kerning:1.0000pt;">}</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  23. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  24. mso-font-kerning:1.0000pt;">public SocketUtil connect(String liveuid, String stream) {</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  25. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  26. mso-font-kerning:1.0000pt;">  if (mSocket != null) {</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  27. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  28. mso-font-kerning:1.0000pt;">      mSocket.on(Socket.EVENT_CONNECT, mConnectListener);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  29. mso-font-kerning:1.0000pt;">      mSocket.on(Socket.EVENT_DISCONNECT, mDisConnectListener);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  30. mso-font-kerning:1.0000pt;">       mSocket.on(Socket.EVENT_CONNECT_ERROR, mErrorListener);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  31. mso-font-kerning:1.0000pt;">      mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, mTimeOutListener);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  32. mso-font-kerning:1.0000pt;">     mSocket.on(Socket.EVENT_RECONNECT, mReConnectListener);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  33. mso-font-kerning:1.0000pt;">     mSocket.on(CONN, onConn);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  34. mso-font-kerning:1.0000pt;">        mSocket.on(BROADCAST, onBroadcast);</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  35. mso-font-kerning:1.0000pt;">     mSocket.connect();</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  36. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  37. mso-font-kerning:1.0000pt;">     mLiveuid = liveuid;</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  38. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  39. mso-font-kerning:1.0000pt;">     mStream = stream;</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  40. mso-font-kerning:1.0000pt;">        return this</span></p>
复制代码

然后再与服务端实现通信。只需要简单传入参数,并emit到服务端,服务端接收后通过逻辑处理,向相应的App端转发socket信息,这时,接收到消息的客户端根据socket的method、action等特定字符判断是否需要作出相应操作,若接收到的信息是自己需要的,则作出相应操作,否则不响应,至此,一个通讯流程就这样完成了。
  1. <p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  2. mso-font-kerning:1.0000pt;">public void anchorBusy(String touid) {</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  3. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  4. mso-font-kerning:1.0000pt;">        if (mSocket == null) {</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  5. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  6. mso-font-kerning:1.0000pt;">            return;</span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  7. mso-font-kerning:1.0000pt;">        mSocket.emit(SEND,</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  8. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  9. mso-font-kerning:1.0000pt;">                new SendSocketBean()</span><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  10. mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  11. mso-font-kerning:1.0000pt;">                        .param("_method_", LINK_MIC) </span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  12. mso-font-kerning:1.0000pt;">                        .param("action", 7)  </span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  13. mso-font-kerning:1.0000pt;">                        .param("msgtype", 10) </span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  14. mso-font-kerning:1.0000pt;">                        .param("touid", touid)  </span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:微软雅黑;font-size:10.5000pt;
  15. mso-font-kerning:1.0000pt;">                        .create()</span></p>
复制代码

通过使用Socket.I O,可以实现A客户端与服务端与B客户端进行连麦PK的操作,当然,Socket.IO还能做更多的事。

发表于 2020-6-21 12:59:16 | 显示全部楼层
这个真是厉害了,准备下载来看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

 
 
工作时间:
8:00-18:00
客服热线:
15368564009
客服微信