Workerman5.0如何实现一对一聊天

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍

2 Extra Icons:JetBrains IDE的图标增强神器

3 IDEA插件推荐-SequenceDiagram,自动生成时序图

4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?

5 IDEA必装的插件:Spring Boot Helper的使用与功能特点

6 Ai assistant ,又是一个写代码神器

7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

要实现一对一聊天功能,使用 Workerman 5.0 作为后端,前端可以使用 WebSocket 进行通信。以下是实现步骤和代码示例。

1. 安装 Workerman

首先,确保你已经安装了 Workerman。可以通过 Composer 安装:

bash 复制代码
composer require workerman/workerman

2. 后端代码

创建一个 PHP 文件(例如 chat_server.php),用于处理 WebSocket 连接和消息传递。

php 复制代码
<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use Workerman\Connection\TcpConnection;

// 创建一个 WebSocket 服务器
$ws_worker = new Worker("websocket://0.0.0.0:2346");

// 保存用户连接的数组
$users = [];

// 当有客户端连接时
$ws_worker->onConnect = function(TcpConnection $connection) use (&$users) {
    echo "New connection\n";
};

// 当有客户端发送消息时
$ws_worker->onMessage = function(TcpConnection $connection, $data) use (&$users) {
    $message = json_decode($data, true);

    if (isset($message['type'])) {
        switch ($message['type']) {
            case 'login':
                // 用户登录,保存连接
                $users[$message['user_id']] = $connection;
                $connection->user_id = $message['user_id'];
                echo "User {$message['user_id']} logged in\n";
                break;

            case 'chat':
                // 一对一聊天
                if (isset($users[$message['to_user_id']])) {
                    $users[$message['to_user_id']]->send(json_encode([
                        'type' => 'chat',
                        'from_user_id' => $connection->user_id,
                        'message' => $message['message']
                    ));
                }
                break;
        }
    }
};

// 当客户端断开连接时
$ws_worker->onClose = function(TcpConnection $connection) use (&$users) {
    if (isset($connection->user_id)) {
        unset($users[$connection->user_id]);
        echo "User {$connection->user_id} disconnected\n";
    }
};

// 运行 worker
Worker::runAll();

3. 前端代码

在前端,使用 WebSocket 连接到服务器,并实现登录和发送消息的功能。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebSocket Chat</title>
</head>
<body>
    <div>
        <input type="text" id="user_id" placeholder="Your User ID">
        <button onclick="login()">Login</button>
    </div>
    <div>
        <input type="text" id="to_user_id" placeholder="To User ID">
        <input type="text" id="message" placeholder="Message">
        <button onclick="sendMessage()">Send</button>
    </div>
    <div id="chat"></div>

    <script>
        let ws;
        let user_id;

        function login() {
            user_id = document.getElementById('user_id').value;
            ws = new WebSocket('ws://127.0.0.1:2346');

            ws.onopen = function() {
                ws.send(JSON.stringify({
                    type: 'login',
                    user_id: user_id
                }));
            };

            ws.onmessage = function(event) {
                const message = JSON.parse(event.data);
                if (message.type === 'chat') {
                    document.getElementById('chat').innerHTML += `<p>From ${message.from_user_id}: ${message.message}</p>`;
                }
            };
        }

        function sendMessage() {
            const to_user_id = document.getElementById('to_user_id').value;
            const message = document.getElementById('message').value;
            ws.send(JSON.stringify({
                type: 'chat',
                to_user_id: to_user_id,
                message: message
            }));
        }
    </script>
</body>
</html>

4. 运行服务器

在终端中运行 PHP 文件启动 WebSocket 服务器:

bash 复制代码
php chat_server.php start

5. 测试

  1. 打开两个浏览器窗口,分别输入不同的用户 ID 并登录。
  2. 在一个窗口中输入目标用户 ID 和消息,点击发送。
  3. 另一个窗口应该会收到消息并显示在页面上。

总结

通过以上步骤,你可以实现一个简单的一对一聊天系统。Workerman 作为后端处理 WebSocket 连接和消息传递,前端通过 WebSocket 与服务器通信,实现实时聊天功能。

相关推荐
珍宝商店12 分钟前
原生 JavaScript 方法实战指南
开发语言·前端·javascript
神龙斗士24019 分钟前
Java 数组的定义与使用
java·开发语言·数据结构·算法
白露与泡影20 分钟前
2025互联网大厂高频Java面试真题解析
java·开发语言·面试
gopyer24 分钟前
180课时吃透Go语言游戏后端开发2:Go语言中的变量
开发语言·游戏·golang·游戏后端开发
月月吃喝26 分钟前
【PyQt5】嵌套多线程数据交互实现
开发语言·qt·交互
匿名45930 分钟前
Lombok注解使用无效的情况(未能获得后端数据)
java·开发语言
用户35218024547530 分钟前
🌭 代码审计-xiuno BBS
安全·php
徐子童1 小时前
JVM高频面试题---GC垃圾回收
java·开发语言·jvm·面试题·gc·垃圾回收算法
Z_z在努力1 小时前
【数据结构】队列(Queue)全面详解
java·开发语言·数据结构
BingoGo1 小时前
PHP 8.2 vs PHP 8.3 对比:新功能、性能提升和迁移技巧
后端·php