zoukankan      html  css  js  c++  java
  • 利用Swoole实现PHP+websocket直播,即使通讯

    websocket

    Websocket只是一个网络通信协议就像 http、ftp等都是网络通信的协议一样
    相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议;

    WebSocket和HTTP的关系

    WebSocket和HTTP的关系

    有交集,但是并不是全部。
    Websocket只是借用了HTTP的一部分协议来完成一次握手。(HTTP的三次握手,此处只完成一次)

    Http 协议

    第一次握手:主机A发送位码为syn1,随机产生seq number=1234567的数据包到服务器,主机BSYN=1知道,A要求建立联机;

    第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机Aseq+1),syn=1,ack=1,随机产生seq=7654321的包

    第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机Bseq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

    完成三次握手,主机A与主机B开始传送数据。

    Long poll Ajax轮询以及WebSocket的原理

    1Ajax轮询的原理。

    场景如下:

    客户端:啦啦啦,有没有新信息(Request)
    服务端:没有(Response
    客户端:啦啦啦,有没有新信息(Request)
    服务端:没有。。(Response
    客户端:啦啦啦,有没有新信息(Request)
    服务端:你好烦啊,没有啊。。(Response
    客户端:啦啦啦,有没有新消息(Request
    服务端:好啦好啦,有啦给你。(Response
    客户端:啦啦啦,有没有新消息(Request
    服务端:。。。。。没。。。。没。。。没有(Response---- loop

    代码:

    var polling = function(url, type, data){
        var xhr = new XMLHttpRequest(), 
            type = type || "GET",
            data = data || null;
    
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4) {
                receive(xhr.responseText);
                xhr.onreadystatechange = null;
            }
        };
    
        xhr.open(type, url, true);
        //IE的ActiveXObject("Microsoft.XMLHTTP")支持GET方法发送数据,
        //其它浏览器不支持,已测试验证
        xhr.send(type == "GET" ? null : data);
    };
    
    var timer = setInterval(function(){
        polling();
    }, 1000);

    2、long poll的原理。

    long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,

     客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

    场景如下:

    客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
    服务端:额。。 (等待到有消息的时候)。。来 给你(Response)
    客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)

     客户端:啦啦啦啦,有新信息么?

    服务端:月线正忙,请稍后再试(503 Server Unavailable

    客户端:。。。。好吧,啦啦啦,有新信息么?
    服务端:月线正忙,请稍后再试(503 Server Unavailable

    客户端:

    代码:

    var longPoll = function(type, url){
        var xhr = new XMLHttpRequest();
    
        xhr.onreadystatechange = function(){
            // 状态为 4,数据传输完毕,重新连接
            if(xhr.readyState == 4) {
                receive(xhr.responseText);
                xhr.onreadystatechange = null;
    
                longPoll(type, url);
            }
        };
    
        xhr.open(type, url, true);
        xhr.send();
    }

    然后服务端在一旁忙的要死:冰箱,我要更多的冰箱!更多。。更多。。

     从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性

    何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。

     缺陷:

    从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。
    ajax轮询 需要服务器有很快的处理速度和资源。(速度)
    long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
    所以ajax轮询 和long poll 都有可能发生这种情况。

     3、WebSocket的原理。

    这时Websocket出现了。
    他解决了HTTP的这几个难题。
    首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。
    所以上面的情景可以做如下修改。
    客户端:啦啦啦,我要建立Websocket协议,需要的服务:chatWebsocket协议版本:17HTTP Request
    服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched
    客户端:麻烦你有信息的时候推送给我噢。。
    服务端:ok,有的时候会告诉你的。
    服务端:balabalabalabala
    服务端:balabalabalabala
    服务端:哈哈哈哈哈啊哈哈哈哈
    服务端:笑死我了哈哈哈哈哈哈哈

     但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。

    同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler

    代码见下篇

    父亲节快到了,常回家看看!

    树欲静而风不止,子欲孝而亲不在!

  • 相关阅读:
    CentOS7基础优化与常用配置
    MHA+binlogserver+VIP+sendreport 高可用架构
    GTID主从复制
    主从复制故障处理
    主从复制
    mysql 配置文件
    通用二进制安装mysql-5.7.28(无坑)
    css动画 文字闪烁效果
    cmd命令提示符大全(干货)
    JS实现手机摇一摇功能
  • 原文地址:https://www.cnblogs.com/liucaodan/p/7027641.html
Copyright © 2011-2022 走看看