创建WebSocket服务器

程序代码

ws_server.php

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    $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();

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

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

  • 客户端向服务器端发送信息时,服务器端触发onMessage事件回调
  • 服务器端可以调用$server->push()向某个客户端(使用$fd标识符)发送消息
  • 服务器端可以设置onHandShake事件回调来手工处理WebSocket握手

运行程序

php ws_server.php

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

var wsServer = 'ws://127.0.0.1:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
    console.log("Connected to WebSocket server.");
};

websocket.onclose = function (evt) {
    console.log("Disconnected");
};

websocket.onmessage = function (evt) {
    console.log('Retrieved data from server: ' + evt.data);
};

websocket.onerror = function (evt, e) {
    console.log('Error occured: ' + evt.data);
};
  • 不能直接使用swoole_client与websocket服务器通信,swoole_client是TCP客户端
  • 必须实现WebSocket协议才能和WebSocket服务器通信,可以使用swoole/framework提供的PHP WebSocket客户端

Comet

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


  • Xmg

    和 demo 一样 提示错误:WebSocket connection to 'ws://127.0.0.1:50011/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

  • 屏风山下的猎人

    实验成功

  • 向林

    请问你解决了吗?

  • 张

    ws://127.0.0.1:50011/ 这里写你开启ws服务的ip地址,不一定都是127.0.0.1(比如你在win上用虚拟机的情况下)

  • tb

    客户端:websocket.send("hello tb"); 服务端:message:hello tb

  • 向林

    谢谢 已经好了 但是那个bInd方法不知道该如何使用

  • 苏东坡

    web socket服务器可以用OnTask吗?

  • 羊毛先生

    请问这个 swoole_websocket_server 跟 swoole_server 有什么区别?

  • 羊毛先生

    我想做斗鱼弹幕类似的功能,应该用哪个呢,感觉都是长链接啊,都能用?

  • lovyhui

    swoole_http_server是swoole_server的子类,内置了Http的支持 swoole_websocket_server是swoole_http_server的子类,内置了WebSocket的支持

  • lovyhui

    WebSocket

  • Xmg

    解决了

  • 别怕

    运行文件之后 在谷歌浏览器输入了一段话 命令行报错PHP Notice: Undefined property: Swoole\Http\Request::$get in /var/www/html/ws_server.php on line 7 int(1)

  • 别怕

    运行之后命令行一直显示client-1 is closed client-2 is closed client-3 is closed client-4 is closed client-5 is closed client-6 is closed client-7 is closed client-8 is closed client-9 is closed client-10 is closed

  • 西瓜撑破肚皮

    怎么在这里弄一个定时器?

  • 东源

    请问 是怎么解决的?

  • 刘欣

    注意ip 127.0.0.1是你本地ip 你js 和php websock文件不在一台机器上 指定websocket 文件运行的机器ip

  • 东源

    谢啦,一直没看回复

  • 月渎命

    我安装了swoole,用php ws_server.php运行完报了个致命错误“Fatal error: Class 'swoole_websocket_server' not found”,请问你们有出现这个问题么,我用php -m查看了,有swoole这个模块

  • 月渎命

    解决了,是swoole版本的问题

  • 初学者想学一下swoole,希望有人给予解答: 是不是一个类似网络棋牌游戏大厅这种网页游戏,服务端就可以用swoole_websocket_server? 客户端是用http_client还是直接js的websocket? 有没有大神给解释下swoole各服务器和客户端到底怎么用?以游戏大厅为例说一下整体系统架构。

  • 红颜弹指老、刹那芳华

    用demo写的,报这个错误。Class 'Home\Controller\swoole_websocket_server' not found 我的版本是1.9.11

  • c'est la vie

    comet服务端怎么写啊??????????

  • lin

    client-10 is closed client-11 is closed client-12 is closed client-13 is closed client-14 is closed client-15 is closed 一直这个什么鬼

  • Mercury

    WebSocket connection to 'ws://127.0.0.1:9501/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED 这个错误是为什么

  • 凉生-一脸蒙蔽

    WebSocket connection to 'wss://112.74.171.61:9502/' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT 请问这个问题有解决了的吗?

  • Eternalsun

    需要先用cmd 执行php文件去实例化websocket类 然后在打开前段页面

  • king_cjl

    service iptables stop 以上命令是,宿主访问寄宿的虚拟机,有报错的可以看下

  • ミ﹏单身的理由

    swoole都安装好了,php -m能看到成功加载,phpinfo里也能看到swoole模块,但只要一运行server.php就报class 'swoole_websocket_server' not found in......是怎么回事

  • 页面报错400,黑屏client-1 is closed client-2 is closed client-3 is closed client-4 is closed client-5 is closed client-6 is closed client-7 is closed client-8 is closed client-9 is closed client-10 is closed 怎么解决呀

  • 若隐若现

    WebSocket connection to 'wss://112.74.171.61:9502/' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT 这个问题是什么原因,谁能说下

  • 遗忘

    直接请求地址会返回undefind不知道是什么原因

  • 遗忘

    例如访问这个的时候ws://127.0.0.1:9502 返回undefined

  • 一张白纸

    在服务器测试,用浏览器访问时,应把127.0.0.1改成服务器地址。

  • 蛟十五

    实验ok

  • 萧十一郎

    按照demo 测试,客户端没有报错,但是也没有返回握手成功的相关信息,不知道是成功还是失败了,如果给服务器发消息会报这个错误。Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.。有大神指导下么

  • 新用户(手机注册)

    为什么服务打印的 $request->fd, $request->get, $request->server 这个几个值都是空的