程序代码

ws_server.php

  1. //创建websocket服务器对象,监听0.0.0.0:9502端口
  2. $ws = new swoole_websocket_server("0.0.0.0", 9502);
  3. //监听WebSocket连接打开事件
  4. $ws->on('open', function ($ws, $request) {
  5. var_dump($request->fd, $request->get, $request->server);
  6. $ws->push($request->fd, "hello, welcome\n");
  7. });
  8. //监听WebSocket消息事件
  9. $ws->on('message', function ($ws, $frame) {
  10. echo "Message: {$frame->data}\n";
  11. $ws->push($frame->fd, "server: {$frame->data}");
  12. });
  13. //监听WebSocket连接关闭事件
  14. $ws->on('close', function ($ws, $fd) {
  15. echo "client-{$fd} is closed\n";
  16. });
  17. $ws->start();

WebSocket服务器是建立在Http服务器之上的长连接服务器,客户端首先会发送一个Http的请求与服务器进行握手。握手成功后会触发onOpen事件,表示连接已就绪,onOpen函数中可以得到$request对象,包含了Http握手的相关信息,如GET参数、Cookie、Http头信息等。

建立连接后客户端与服务器端就可以双向通信了。

  • 客户端向服务器端发送信息时,服务器端触发onMessage事件回调

  • 服务器端可以调用$server->push()向某个客户端(使用$fd标识符)发送消息

  • 服务器端可以设置onHandShake事件回调来手工处理WebSocket握手

运行程序

  1. php ws_server.php

可以使用Chrome浏览器进行测试,JS代码为:

  1. var wsServer = 'ws://127.0.0.1:9502';
  2. var websocket = new WebSocket(wsServer);
  3. websocket.onopen = function (evt) {
  4. console.log("Connected to WebSocket server.");
  5. };
  6. websocket.onclose = function (evt) {
  7. console.log("Disconnected");
  8. };
  9. websocket.onmessage = function (evt) {
  10. console.log('Retrieved data from server: ' + evt.data);
  11. };
  12. websocket.onerror = function (evt, e) {
  13. console.log('Error occured: ' + evt.data);
  14. };
  • 不能直接使用swoole_client与websocket服务器通信,swoole_client是TCP客户端

  • 必须实现WebSocket协议才能和WebSocket服务器通信,可以使用swoole/framework提供的

Comet

WebSocket服务器除了提供WebSocket功能之外,实际上也可以处理Http长连接。只需要增加onRequest事件监听即可实现Comet方案Http长轮询。

原文:https://wiki.swoole.com/wiki/page/479.html