用swoole扩展编写WebSocket聊天室

最近正在接触swoole扩展 先写个简单的swoole聊天室demo吧

<!DOCTYPE html>
<html>
<head>
  <title>swoole chatroom</title>
  <meta charset="UTF-8">
  <script type="text/javascript">
   var exampleSocket = new WebSocket("ws://0.0.0.0:9501");
   exampleSocket.onopen = function (event) {
    exampleSocket.send("连接!"); 
   };
   exampleSocket.onmessage = function (event) {
    var chat_room = document.querySelector("#chatroom");
    var data = event.data;
    var chat_list = document.createElement("li");
    var chat_content = document.createTextNode(data);
    chat_list.appendChild(chat_content);
    chat_room.appendChild(chat_list);   
   }
  </script>
</head>
<body>
 <input type="text" id="content">
 <button οnclick="exampleSocket.send( document.getElementById('content').value )">发送</button>
 <div id="chatroom">
  <ul id="chatlist">
  </ul>
 </div>
</body>
</html>

用的是连接方式是WebSocket

使用将onopen绑定到WebSocket事件原因是因为建立WebSocket的方式是异步的,所以要在其成功建立对象时确定连接是否成功

onmessage是接受消息时触发的方法

<?php

$server = new swoole_websocket_server("0.0.0.0", 9501);
$max = 0;

$server->on('open', function (swoole_websocket_server $server, $req) {
    //每一次客户端连接 最大连接数将增加
    global $max;
    $max++;
});

$server->on('message', function (swoole_websocket_server $server, $frame) {
    $fd   = $frame->fd;
    $data = $frame->data;
    $message = "连接号{$fd}:内容:{$data}";
    global $max;
    //向所有人广播
    for ($i = 1; $i <= $max; $i++) {
        echo PHP_EOL . time('Y-m-d h:m:s') . ': ' . $fd . " : " . $data;
        $server->push($i, $message);
    }
});

$server->on('close', function (swoole_websocket_server $server, $fd) {
    //关闭连接 连接减少
    global $max;
    $max--;
    echo "client {$fd} closed\n";
});

$server->start();

服务端的原理:

全局变量$max存储连接数,每当发生一个WebSocket连接时,$max加一

取得连接后,用push向所有连接进行广播

关闭连接时,连接数减少

然而这仍然存在一些问题 比如当浏览器刷新的时候 没有close掉旧的连接 而是又创建了一个新的连接

这些在该demo里都没有得到处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值