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

一、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

 

posted @ 2022-01-19 15:04  雁塔小兵  阅读(489)  评论(0编辑  收藏  举报