利用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

 

代码见下篇

 

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

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

posted @ 2017-06-16 15:08  艹丶蛋  阅读(14703)  评论(3编辑  收藏  举报