原文:https://www.ruanyifeng.com/blog/2017/05/websocket.html
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
其他特点包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
常用Api:
客户端/浏览器:
// 创建实例
var ws = new WebSocket('ws://localhost:8080');
// 连接成功事件
ws.onopen = function () {
}
// 发送消息
ws.send('Hello Server!');
// 关闭连接事件
ws.onclose = function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
};
//收到消息事件
ws.onmessage = function(event) {
var data = event.data;
// 处理数据
};
//异常处理
ws.onerror = function(event) {
// handle error event
};
服务端:
以Swoole
的WebSocket
服务器为例
//创建WebSocket Server对象,监听0.0.0.0:8080端口。
$ws = new Swoole\WebSocket\Server('0.0.0.0', 8080);
//监听WebSocket连接打开事件。
$ws->on('Open', function ($ws, $request) {
$ws->push($request->fd, "hello, welcome\n");
});
//监听WebSocket消息事件。
$ws->on('Message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
});
//监听WebSocket连接关闭事件。
$ws->on('Close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();