workerman、websocket简单聊天功能从0到1实现

2023-07-29,,

一、workerman安装,测试环境为linux

1、在网站根目录,用命令行安装,要是出现root权限提示,输入y回车就行,或者新建一个用户再进入安装

Linux系统可以使用以下脚本测试本机PHP环境是否满足WorkerMan运行要求。
curl -Ss https://www.workerman.net/check | php

上面脚本如果全部显示ok,则代表满足WorkerMan要求

安装命令:

设置镜像
由于国内访问composer比较慢,建议设置阿里云composer镜像,运行如下命令设置阿里云代理

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

安装workerman
在根目录中运行
composer require workerman/workerman

2、安装后的效果图如下,或者直接下载官方代码包复制进来

3、开启服务器2345端口,测试服务器为腾讯云,在腾讯云控制平台开启就行

4、在根目录建一个start.php的文件,内容如下所示:

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php'; $global_uid = 0;
// 当客户端连上来时分配uid,并保存连接,并通知所有客户端
function handle_connection($connection)
{
global $text_worker, $global_uid;
// 为这个连接分配一个uid
$connection->uid = ++$global_uid; } // 当客户端发送消息过来时,转发给所有人
function handle_message(TcpConnection $connection, $data)
{
global $text_worker;
foreach($text_worker->connections as $conn)
{ // $conn->send("user[{$connection->uid}]"."进来了");
$conn->send($data);
}
} // 当客户端断开时,广播给所有客户端
function handle_close($connection)
{
global $text_worker;
foreach($text_worker->connections as $conn)
{ $conn->send("user[{$connection->uid}] logout");
}
} // 创建一个Worker监听2347接口
$text_worker = new Worker("websocket://0.0.0.0:2345"); // 只启动1个进程,这样方便客户端之间传输数据
$text_worker->count = 1; $text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close'; Worker::runAll();

5、在根目录用命令进行启动,我在宝塔上启动的,加了-d 可以关闭启动窗口后进程不死

启动命令:php start.php start -d

停止命令:php start.php stop

重启命令:php start.php restart

6、再建一个静态html页面进行测试,ws地址要换成你的ip或者网站都行,我的是ws://d.aaa.net:2345内容如下:

<!doctype html>
<html> <head>
<meta charset="utf-8">
<title>websocket测试</title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
</head> <body>
<input type="text" id="roomid" value="无名">房间号
<br/>
<input type="text" id="firstname" value="你好"><button onclick="testsend()">发送</button><button onclick="closeaa()">关闭</button>
<br>
<div id="content"></div>
<script type="text/javascript">
ws = new WebSocket("ws://d.aaa.net:2345");
ws.onopen = function() {
alert("连接成功");
};
ws.onmessage = function(e) {
//alert("收到服务端的消息:" + e.data);
var re = JSON.parse(e.data);
//document.getElementById('content').innerHTML +=re+"<br/>";
document.getElementById('content').innerHTML +=re.roomid+"说:"+re.content+"<br/>";
}; function testsend(){
var roomid = document.getElementById('roomid').value;
var word = document.getElementById('firstname').value;
var re={"roomid":roomid,"content":word}
//var re = roomid+'.'+word;
ws.send(JSON.stringify(re));
}
function closeaa(){
if(ws){
ws.close();
alert("已经关闭");
}
return false;
}
</script>
</body> </html>

 7、到这里就结束了,可以把这个html页面上传到服务器上发给别人进行测试一下,我这里效果如下

要是做点对点聊天,建议用GatewayWorker

workerman、websocket简单聊天功能从0到1实现的相关教程结束。

《workerman、websocket简单聊天功能从0到1实现.doc》

下载本文的Word格式文档,以方便收藏与打印。