CY-Left

PHP开发语言未分类网络原理

swoole websocket 起步 入门

swoole websocket 起步操作

安装 swoole

此处省略

创建 websocket 服务

服务端: swoole.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();

客户端 client.html

<html>
<head>
    <title>swoole</title>
</head>

<script>
    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);
    };
</script>
</html>

开启服务

swoole 支持的服务只能在 cli 模式下运行, 所以我们切换到 swoole.php 目录下, 执行

php swoole.php

然后在浏览器打开 client.html, 打开控制台, 运气好如下:

Connected to WebSocket server.
websocket:20 Retrieved data from server: hello, welcome

但是一般会有很多问题.

1. 防火墙导致的的端口无法使用

WebSocket connection to ‘ws://127.0.0.1:9502/’ failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

1.1. 关闭防火墙或者放行相关端口(9502)

centos 7 操作如下:

# 查看开放的端口, 一般默认开放 80 之流
firewall-cmd --list-ports

#添加开放端口 9502
# --permanent 永久生效,没有此参数重启后失效
# websocket 建立在 tcp 协议之上, 开启 tcp 协议即可
firewall-cmd --zone=public --add-port=9502/tcp --permanent

# 改完配置重启服务
systemctl restart firewalld.service

# 注, centos 7 防火墙管理软件不是 iptables, 低版本 centos 请参照其他教程
# 关闭防火墙会有别的问题, 比如连 80 都无法访问

1.2 修改客户端请求地址

client.html 中, 不一定全为 127.0.0.1, 所以修改成 websocket 服务器 ip : ws://123.xxx.xxx.xxx:9502/

这样一来, 应该就能够建立 websocket 连接了

本文虽拙,却也系作者劳动,转载还请保留本文链接: http://cyleft.com/?p=905