uniapp之微信小程序开发教程及如何合理使用WebSocket(实时监听)+workman聊天系统+linux系统配置阿里云端口

2023-11-16

添加链接描述
添加链接描述

thinphp6.1---workerman文档
[添加链接描述](https://www.kancloud.cn/manual/thinkphp6_0/1147857)
workerman手册:https://www.workerman.net/doc/workerman/faq/client-connect-fail.html

在阿里云配置好端口(linux启动端口)

在这里插入图片描述

如果不关闭防火墙的话,也可以在防火墙规则中添加端口。如果端口被占用就先杀死进程。

添加端口80:firewall-cmd --zone=public --add-port=80/tcp --permanent
更新防火墙规则: firewall-cmd --reload
重启服务:systemctl restart firewalld.service
查看所有打开的端口: firewall-cmd --zone=public --list-ports

WebSocket服务一旦开启就会有进程,失败也有进程,所以必须先杀死进程,否则之前设置的端口就被占用了。
查询某个端口是否被占用:lsof -i :9501 如果有进程存在说明被占用
————————————————
版权声明:本文为CSDN博主「Jason Ho」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42433970/article/details/100653124

在这里插入图片描述

uniapp长连接

			// 判断是否已连接
					checkOpenSocket () {
								let self = this;
								uni.sendSocketMessage({
									data: 'ping',//需要发送的内容
									 success: (res) => {
										 console.log(res);
										return;
									},
									fail: (err) => { // 未连接打开websocket连接
										self.openConnection(); 
									}
								});
							   },
							openConnection() { // 打开连接
									uni.closeSocket(); // 确保已经关闭后再重新打开
									uni.connectSocket({
										// 【非常重要】必须确保你的服务器是成功的
										url: "ws://192.168.70.65:2000",
										success(data) {
											console.log(data);//链接成功提示
											console.log("websocket正在连接...");
										},
									});
								
								// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
									uni.onSocketOpen(function (res) {
										console.log(res);
										  console.log('WebSocket连接成功');
										});
									//连接成功后如果有服务器返回的消息 先接收
									this.onSocketMessage(2); 
								},
								
								//	打开成功监听服务器返回的消息
							onSocketMessage (type = 1) { // 消息
								   console.log(34534);
									this.timeout = 60000;
									this.timeoutObj = null;
							   uni.onSocketMessage((res) => {
										console.log(res)//服务器返回的消息
									let giveMsg = res.data;
									// 后台绑定client_id
									// 如果返回有数据 转换
									if (giveMsg) {
										let msg = JSON.parse(giveMsg);
											console.log("判断是否有数据"+giveMsg)
											console.log("触发心跳")
											this.reset(); 
									}
									// 如果没连接成功服务器并没有返回数据
									this.getSocketMsg(res.data); // 监听到有新服务器消息
								});
								},
							     // 监听到有新服务器消息 将数据弹出在聊天框中
									getSocketMsg (reData) { // 监听到服务器消息
										console.log('监听到服务器消息 reData=', reData);
										let info = JSON.parse(reData);
											console.log(info);
										console.log('app onMessage=', reData)
									},
								// 检测心跳reset
										reset () {
											clearInterval(this.timeoutObj);
											this.start(); // 启动心跳
										},
										
								// 启动心跳 start 
										start () {
											let self = this;
											this.timeoutObj = setInterval(function(){
												uni.sendSocketMessage({
													data: 'ping',
													 success: (res) => {
														console.log('连接中....成功');
														console.log(res);
													},
													fail: (err) => {
														console.log('连接失败重新连接....');
														self.openConnection();
													}
												});
											}, this.timeout);
										},

前端访问

<html>
<body>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"></script>
<input type="text" style="width: 500px" class="name"><input class="save" type="button" value="提交"></body>
</html>
<script>
    ws = new WebSocket("ws://121.40.176.39:2346");
    ws.onopen = function () {
        alert('连接成功!');
        $('.save').on('click', function () {
            let text = $('.name').val();
            var arr = '{"clentId":1,"text":' + text + ',"type":1}';
            ws.send(arr);
        })
    };
    ws.close = function () {
        alert('close..')
    }
    ws.onmessage = function (e) {
        alert('收到服务消息:')
        let value = e.data;
        $('.name').val(value);
    };
</script>

workman聊天系统

Linux命令行:composer require topthink/think-worker
配置文件worker_server.php
<?php
return [
    'socket' => 'http://127.0.0.1:2346',
    'name' => 'thinkphp',
    'count' => 1,
    'worker_class' => 'app\webSocket\Worker', //类文件地址
    '工单'=>1,
];
worker文件夹:app\webSocket\Worker
<?php
/**
 * 工单处理
 */

namespace app\webSocket;

use think\worker\Server;
use think\facade\Db;
use app\webSocket\workOrder\Worker as orderWorker;


class Worker extends Server
{
    protected $socket = 'websocket://0.0.0.0:2346';

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {
        dump(23);
        //上传工单id
        //获取聊天记录
        $data = [];
        $data['code'] = 200;
        $data['msg'] = '链接成功';
        $connection->workOrderId = 0;
        $connection->userId = 0;
        $connection->send(json_encode($data));
    }

    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        $data = json_decode($data, true);
        $statusType = $data['statusType'] ?? 1;//1-代表代表是工单类型
        if ($statusType == 1) {
            if ($data['isHaed'] == 1) {
                //处理心跳
                return true;
            } else {
                if ($data['isSign'] == 1) {
                    //如果是注册,那么查询消息列表,并记录该链接;
                    //记录链接
                    $this->worker->workerOrder[$data['id']][$data['userId']] = $connection;
                    //查询消息列表
                    $res = (new orderWorker())->msg($data);
                    $connection->send(json_encode($res));
                } else {
                    //刷新数据
                   if ($data['imagesType'] == 9) {
                       $res = (new orderWorker())->msg($data);
                        $connection->send(json_encode($res));
                    } else {
                        //不是注册,那么消息写入数据库,并推送到其他终端
                        //消息写入数据库
                        $res = (new orderWorker())->insertMessage($data);
                        //推送到其他终端
                        if (isset($this->worker->workerOrder[$data['id']])) {
                            $arr = $this->worker->workerOrder[$data['id']];
                            foreach ($arr as $value) {
                                //如果是自己,那么跳过
                                $value->send(json_encode($res));
                            }
                        }
                }
                }
            }
        } else {
            $connection->send(json_encode(['code' => 400, 'message' => '该服务类型未定义!']));
        }
    }

    //用户断开链接app\webSocket\Worker
    public function onClose($connection)
    {
        $connection->send('关闭连接');
    }

}

在这里插入图片描述

linux(window->cmd)查看执行命令

php think worker:server-》显示服务内容
php think worker start-》开启服务
php think worker [start|stop|reload|restart|status]-其它命令
配置或查看阿里云端口是否开启
如果不关闭防火墙的话,也可以在防火墙规则中添加端口。如果端口被占用就先杀死进程。

添加端口80:firewall-cmd --zone=public --add-port=80/tcp --permanent
更新防火墙规则: firewall-cmd --reload
重启服务:systemctl restart firewalld.service
查看所有打开的端口: firewall-cmd --zone=public --list-ports

WebSocket服务一旦开启就会有进程,失败也有进程,所以必须先杀死进程,否则之前设置的端口就被占用了。
查询某个端口是否被占用:lsof -i :9501 如果有进程存在说明被占用
————————————————
版权声明:本文为CSDN博主「Jason Ho」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42433970/article/details/100653124
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uniapp之微信小程序开发教程及如何合理使用WebSocket(实时监听)+workman聊天系统+linux系统配置阿里云端口 的相关文章

  • 使用 PHP 将 SVG 图像转换为 PNG

    我正在开发一个网络项目 该项目涉及动态生成的美国地图 根据一组数据为不同的州着色 这个 SVG 文件为我提供了一张很好的美国空白地图 并且很容易更改每个州的颜色 困难在于 IE 浏览器不支持 SVG 因此为了让我使用 svg 提供的便捷语法
  • Php mysql 30秒后执行任务

    如何让 mysql 查询命令在访问 php 站点 30 秒后执行 您可以对执行 mysql 查询的 php 脚本发出 AJAX 请求 在 js 中使用计时器
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • PHP:STR 替换为链接

    我有这个 PHP 聊天框 如果我在聊天框中键入链接 它不会将其显示为链接 我如何使用 STR 替换来执行此操作 它应该响应诸如 http http com nl www www 之类的内容 我的其他 STR 替换行如下所示 bericht
  • 如何使用 PHP 动态插入 CSS 类?

    下面的代码有什么问题 我想在相应的情况下动态插入 当前 CSS 类 li 单击元素 谢谢 section section li
  • 如何在 Laravel 中 session_write_close() ?

    Running session write close before sleep 在 Laravel 中似乎不起作用 因为会话仍然被其他请求阻止 直到当前连接完成 我试图sleep 在 Laravel 中 不会阻止其他请求 发现 sessi
  • 如何使用 PHP 查找目录中的前 5 个文件?

    如何使用 PHP 列出按字母顺序排序的目录中的前 5 个文件或目录 Using scandir array slice array filter scandir path to dir is file 0 5 The array filte
  • HTTP_REFERER 返回 NULL,$_SERVER 中不存在密钥

    使用以来第一次 SERVER HTTP REFERER 它给了我NULL因此 当我做var dump SERVER the HTTP REFERER密钥不存在 我还尝试使用不同的浏览器和不同的网站访问网站 但没有结果 该网站在基于 Linu
  • 如何在 Laravel Mix 中将公共路径更改为包含下划线的路径?

    Laravel 5 4 中引入了 Mix 来编译资产并维护资产管道 Mix 默认为您的公共目录被命名public 在许多情况下 包括我的 我的公共目录被称为其他名称 就我而言 是public html 如何更改资源编译到的公共目录 我尝试过
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • 我的 PHP 代码不会将记录插入到 mySQL 数据库表中[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的网站上
  • Mandrill 验证错误

    很高兴能在 StackOverflow 上提出我的第一个问题 多年来我一直依靠它自学了很多东西 我的问题是这样的 尝试通过 Mandrill 的 API 发送邮件时出现以下错误 status error code 1 name Valida
  • 从文本文件 PHP 读取数据

    我只是想知道如何在 php 中读取文本文件 我想让它显示文本文件中的最后 200 个条目 每个条目都在一个新行上 Like John White Jane Does John Does Someones Name 等等 Thanks Use
  • PHP OOP 静态属性语法错误 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 为什么不
  • 仅在 Chrome 上我收到此错误:Uncaught TypeError: Illegal constructor [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在 Chrome 上加载 jQuery 时 我会收到此错误 Uncaught TypeError Illegal constr
  • 如何将类型添加到 Vite 库构建中?

    我按照vite文档使用图书馆模式 https vitejs dev guide build html library mode我能够生成一个工作组件库 我创建了该项目vue ts预设 在我的组件中 我定义了道具及其类型 并使用了一些接口 但
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 由于未定义符号,PECL solr 未加载:curl_easy_getinfo

    我正在尝试加载 PECL solr 扩展 我尝试使用 pecl install solr 并下载并使用 phpize configure make 来安装它 在这两种情况下 扩展安装时都没有错误 但在 apache 重新启动后 或在命令行上
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam

随机推荐