您的位置:首页 > 理论基础 > 计算机网络

利用WebScocket实现消息推送

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

websocket的特点

事件驱动

异步

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

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

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

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息