laravel + workerman 聊天室示例代码

boyanx3个月前技术教程18

这是一个简单的 Laravel + Workerman 聊天室示例代码:

1、安装 Workerman 和 Workerman-for-Websocket

在Laravel项目根目录下使用Composer安装WorkermanWorkerman-for-Websocket

composer require workerman/workerman workerman-for-websocket

2、创建聊天室控制器

在 Laravel 项目中创建一个控制器 ChatController,并添加以下方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Websocket;
use Workerman\Protocols\Http\Request as WorkermanRequest;

class ChatController extends Controller
{
    public function index()
    {
        return view('chat');
    }

    public function start()
    {
        // 创建一个Workerman实例
        $wsWorker = new Worker("websocket://0.0.0.0:8000");
        // 启动4个进程对外提供服务
        $wsWorker->count = 4;

        // 设置回调函数
        $wsWorker->onMessage = function(TcpConnection $connection, $data) {
            // 解析客户端发送的数据
            $messageData = json_decode($data, true);
            $message = $messageData['message'];

            // 发送消息给所有连接的客户端
            foreach($this->connections as $conn) {
                $conn->send(json_encode([
                    'username' => $connection->name,
                    'message' => $message
                ]));
            }
        };

        $wsWorker->onWorkerStart = function($worker) {
            echo "Worker start\n";
        };

        $wsWorker->onConnect = function(TcpConnection $connection) {
            // 给连接设置一个随机用户名
            $connection->name = 'User'.rand(1000, 9999);
            // 把连接加入到连接池中
            $this->connections[$connection->id] = $connection;
        };

        $wsWorker->onClose = function(TcpConnection $connection) {
            // 把连接从连接池中移除
            unset($this->connections[$connection->id]);
        };

        // 启动workerman
        Worker::runAll();
    }

    public function sendMessage(Request $request)
    {
        $data = [
            'message' => $request->message
        ];

        // 发送消息到 Workerman 服务器
        $client = new \Workerman\Connection\AsyncTcpConnection('ws://127.0.0.1:8000');
        $client->send(json_encode($data));
        $client->close();

        return response()->json($data);
    }
}

在这个控制器中,index 方法返回视图文件 chat.blade.php,start 方法启动 Workerman 服务,sendMessage 方法接收来自前端的消息并通过 Workerman 向所有客户端发送消息。

3、创建聊天室视图文件

创建视图文件 chat.blade.html,包括一个输入框和一个按钮用于发送消息:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天室</title>
</head>
<body>
    <div id="message-list"></div>
    <form id="message-form">
        <input type="text" name="message" placeholder="输入消息">
        <button type="submit">发送</button>
    </form>
</body>
</html>

在这个页面中,我们需要将收到的消息显示在 message-list 元素中,并且实现向服务器发送消息的功能。我们可以通过 jQuery 发送 AJAX 请求来实现这一功能。代码如下:

$(function() {
    // 创建 WebSocket 连接
    var ws = new WebSocket('ws://localhost:2345');

    // 监听 WebSocket 连接成功事件
    ws.onopen = function() {
        console.log('WebSocket 连接成功');
    };

    // 监听 WebSocket 收到消息事件
    ws.onmessage = function(evt) {
        var message = evt.data;
        $('#message-list').append('<div>' + message + '</div>');
    };

    // 监听 WebSocket 连接关闭事件
    ws.onclose = function() {
        console.log('WebSocket 连接关闭');
    };

    // 监听表单提交事件
    $('#message-form').submit(function(e) {
        e.preventDefault();
        var message = $('input[name=message]').val();
        ws.send(message);
        $('input[name=message]').val('');
    });
});

这段代码首先创建了一个 WebSocket 连接,然后监听了连接成功、收到消息和连接关闭三个事件。在收到消息事件中,它将收到的消息添加到 message-list 元素中。在表单提交事件中,它获取输入框中的消息,将其发送到服务器,并清空输入框。

这样,我们就实现了一个简单的聊天室,可以在其中发送和接收消息。当然,为了实现更多功能,我们还需要进行更多的代码编写和优化。

相关文章

介jquery.validate.js简单实用的表单验证框架

最近在做用户登录、注册、以及用户中心...然后之前在慕课网学的jquery.validate用得着地方了,根据自己需求进行了细节修改,重要是样式方面吧。第一次发表这些,说得不好不要介意,开始吧。首先:...

Katalon 所有关键字及其含义

以下为katalon所有关键字及其含义,具体可参考官方文档:序号关键字含义1Accept Alert接受当前弹窗(如确认对话框)。2Authenticate处理 HTTP 基础认证(输入用户名和密码)...

jQuery 获取和设置HTML元素

jQuery 中包含更改和操作 HTML 元素和属性的强大方法。我们可以通过这些方法来获取 HTML 元素中的文本内容、元素内容(例如HTML标签)、属性值等。text()方法text() 方法可以用...

编程技巧:Jquery实时验证,小数位补0,指定长度的「正小数」

在只能输入【正小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码<input typ...

前端三剑客:HTML、CSS 和 JavaScript

#头条创作挑战赛#一个基本的网站包含很多个网页,每个网页主要是由三部分组成,即结构(HTML)、表 从入门到精通 Python网络爬虫框架Scrapy 12 现(CSS)和行为(JavaScript)...

教你把百度的关键字搜索偷过来用用。

话不多说,先上效果图。怎么样,是不是和在用百度一下时,关键字搜索补全一样一样的。今天下午没什么事,打开百度首页的Newwork看了一下,发现我每次输入内容后,它都会把我们输入的内容发送到后台,后台返回...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。