利用Swoole实现PHP+websocket直播,即便通信

websocket

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

WebSocket和HTTP的关系

WebSocket和HTTP的关系web

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

Http 协议浏览器

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

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

第三次握手:主机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的原理app

1Ajax轮询的原理。socket

场景以下:

客户端:啦啦啦,有没有新信息(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);

 

 

 

二、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 都有可能发生这种状况。

 三、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

 

代码见下篇

 

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

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

相关文章
相关标签/搜索