zoukankan      html  css  js  c++  java
  • webrtc第二篇 聊天室

    聊天室模型不一样考虑的问题也不一样

    1.websocket文本聊天

     * step1 : 向聊天室所有用户(不包括该用户自己)发送当前用户上线信息。客户端用户栏回添加此用户

    * step2 : 将该用户添加至连接池中

    * step3 : 向该用户发送该聊天室所有用户列表

    * 注:step1 和 step2 顺序颠倒时,会在客户端显示两个"自己"

     

    A客户端向服务器发送消息,服务器向所有连接上的websocket客户端发送消息。

     

    2.webrtc聊天室查看所有人音视频

    A客户端已经加入聊天室,B客户端后加入。

     

    B客户端

     

    step1:B客户端加入后获取所有在线用户。

    step2:向所有PeerConnection发送Offer类型信令

    //向所有PeerConnection发送Offer类型信令
        skyrtc.prototype.sendOffers = function() {
            var i, m,
                pc,
                that = this,
                pcCreateOfferCbGen = function(pc, socketId) {
                    return function(session_desc) {
                        pc.setLocalDescription(session_desc);
                        that.socket.send(JSON.stringify({
                            "eventName": "__offer",
                            "data": {
                                "sdp": session_desc,
                                "socketId": socketId
                            }
                        }));
                    };
                },
                pcCreateOfferErrorCb = function(error) {
                    console.log(error);
                };
            for (i = 0, m = this.connections.length; i < m; i++) {
                pc = this.peerConnections[this.connections[i]];
                pc.createOffer(pcCreateOfferCbGen(pc, this.connections[i]), pcCreateOfferErrorCb);
            }
        };

    step3:接收到answer类型信令后将对方的session描述写入PeerConnection中

    //接收到answer类型信令后将对方的session描述写入PeerConnection中
        skyrtc.prototype.receiveAnswer = function(socketId, sdp) {
            var pc = this.peerConnections[socketId];
            pc.setRemoteDescription(new nativeRTCSessionDescription(sdp));
        };

    A客户端:

    step1:接收到Offer类型信令后作为回应返回answer类型信令

    //接收到Offer类型信令后作为回应返回answer类型信令
        skyrtc.prototype.receiveOffer = function(socketId, sdp) {
            var pc = this.peerConnections[socketId];
            this.sendAnswer(socketId, sdp);
        };
    
        //发送answer类型信令
        skyrtc.prototype.sendAnswer = function(socketId, sdp) {
            var pc = this.peerConnections[socketId];
            var that = this;
            pc.setRemoteDescription(new nativeRTCSessionDescription(sdp));
            pc.createAnswer(function(session_desc) {
                pc.setLocalDescription(session_desc);
                that.socket.send(JSON.stringify({
                    "eventName": "__answer",
                    "data": {
                        "socketId": socketId,
                        "sdp": session_desc
                    }
                }));
            }, function(error) {
                console.log(error);
            });
        };

    参考:

    https://segmentfault.com/a/1190000000436544

  • 相关阅读:
    SpringCloud Alibaba微服务实战十
    万字长文!分布式锁的实现全都在这里了
    python编程中的小技巧(持续更新)
    工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
    github入门操作快速上手
    167. 两数之和 II
    167. 两数之和 II
    167. 两数之和 II
    怎么使用Fiddler进行抓包
    怎么使用Fiddler进行抓包
  • 原文地址:https://www.cnblogs.com/javastart/p/5355317.html
Copyright © 2011-2022 走看看