利用WebScocket实现消息推送

在Web应用中,HTTP协议只支持“请求-响应”模式,即客户端(浏览器)要获取信息只能主动发起请求。在许多需要消息主动推送的场景中,例如:网络聊天室、消息到达提醒等,存在不便。Websocket基于TCP协议,建立一条浏览器到服务器的全双工消息通道,使得服务器可以实时主动推送消息。

websocket的特点
  1. 事件驱动

  2. 异步

  3. 使用ws或者wss协议的客户端socket

  4. 能够实现真正意义上的推送功能

  5. 缺点:支持程度因浏览器的差异而不同。

websocket客户端

websocket是事件驱动的,主要的事件监听函数有一下几个

函数名称事件
onopen建立网络连接时触发
onerror网络出错时触发
onclose连接关闭时触发
onmessage收到数据时触发

常用的函数有

函数名称功能
new WebSocket()新建连接
send向服务器发送数据
close关闭连接
websocket服务器端

websocket的服务器端有多种实现方式,可以根据应用的不同做出不同选择,例如golang, php, java…主要要处理的问题是并发、会话管理。

PHP 中, swoole是一个面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。

下面用一个demon来展示利用swoole php搭建一个简单的websocket推送示例。

//服务端代码
$serv = new swoole_websocket_server(":", 8080);
//如下可以设置多端口监听
//$server = new swoole_websocket_server("0.0.0.0", 9501, SWOOLE_BASE); //$server->addlistener('0.0.0.0', 9502, SWOOLE_SOCK_UDP);
$serv->set(['worker_num' => 1]);


$serv->on('Open', function($server, $req) {
        //客户端连接时
        //可自定义会话管理
        global $reqs;
        $reqs[$id]=$req->fd;
        echo "connection open: ".$req->fd."\n";
        var_dump(count($reqs));//输出长连接数
        }); 

$serv->on('Message', function($server, $frame) {
        //收到来自客户端的消息时
        global $reqs;
        echo "message: ".$frame->data."\n";
        foreach($reqs as $fd){
        $server->push($fd, $frame->data);
        }
        });

$serv->on('Close', function($server, $fd) {
        //关闭连接时
        global $reqs;
        echo "connection close: ".$fd."\n";
        });
//开启服务,监听端口
$serv->start();

客户端

<html>                                                                                                                                                                            
<head>
</head>
<script>
    var wsl= 'ws://10.9.12.21:8080?id=1'
        ws = new WebSocket(wsl);//新建立一个连接
    //如下指定事件处理 
    ws.onopen = function(){ws.send('Test!'); };  
    ws.onmessage = function(evt){console.log(evt.data);/*ws.close();*/};  
    ws.onclose = function(evt){console.log('WebSocketClosed!');};  
    ws.onerror = function(evt){console.log('WebSocketError!');};

</script>

<body>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值