PHP+Swoole简单实现webSocket群聊

简介: 一、效果图

网络异常,图片无法展示
|


一、效果图


网络异常,图片无法展示
|


二、前端页面


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>在线聊天室</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="css/reset.min.css">
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="wrapper">
    <div class="container">
        <div class="left">
            <div class="top"> 在线人员</div>
            <ul class="people">
                <li class="person" data-chat="person1">
                    <img src="img/thomas.jpg" alt=""/>
                    <span class="name">张三</span>
                    <span class="time">10:09</span>
                </li>
                <li class="person" data-chat="person2">
                    <img src="img/dog.png" alt=""/>
                    <span class="name">李四</span>
                    <span class="time">10:44</span>
                </li>
                <li class="person" data-chat="person3">
                    <img src="img/louis-ck.jpeg" alt=""/>
                    <span class="name">王五</span>
                    <span class="time">10:50</span>
                </li>
            </ul>
        </div>
        <div class="right">
            <div class="top"><span><span class="name">聊天室</span></span></div>
            <div class="chat" data-chat="person2">
                <template v-for="item in msgList">
                    <div :class="item.data.style">
                        {{ item.data.data }}
                    </div>
                </template>
<!--                <div class="bubble you">-->
<!--                    帅哥好!-->
<!--                </div>-->
<!--                <div class="bubble me">-->
<!--                    在的,美女!-->
<!--                </div>-->
            </div>
            <div class="write">
                <input type="text" v-model="msg" @keydown.enter="send()"/>
                <a href="javascript:;" class="write-link send" @click="send()"></a>
            </div>
        </div>
    </div>
</div>
</body>
</html>
<script src="js/index.js"></script>
<script src="js/vue.js"></script>
<script>
    //实例化对象
    const ws = new WebSocket('ws://101.34.38.111:6060');
    //监听建立连接事件
    ws.onopen = () => {
        console.log('客户端建立了链接')
    }
    // 接收消息事件
    //{} 叫解构赋值  对象的重命名解构
    ws.onmessage = ({data}) => {
        // 返回的是一个json字符串,json字符串转为对象  es6提供一个方法
        let json = JSON.parse(data)
        vm.msgList.push(json);
        console.log(vm.msgList)
    };
    //进行实例化这个Vue
    const vm = new Vue({
        el:'.wrapper',
        data:{
            msg:'',
            msgList:[]
        },
        //这个methods 必有加s
        methods:{
            send(){
                //获取输入框里面的值
                let msg = this.msg
                //进行发送到websocket服务器
                ws.send(msg)
                this.msg = ''
            }
        }
    })
</script>
复制代码


三、后台代码


<?php
$server = new Swoole\WebSocket\Server("0.0.0.0", 6060);
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
   //$server->push($request->fd, '欢迎进入我们的聊天室~');
});
//接收客户端发送的信息
//$frame 是 Swoole\WebSocket\Frame 对象,包含了客户端发来的数据帧信息
//$frame->fd 代表客户端的唯一标识 客户id
//$frame->data  代表客户端发送的消息
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
    //获取客户端发送的消息
    $result['data'] = $frame->data;
    // $server->connections 遍历所有websocket连接用户的fd,给所有用户推送
    foreach ($server->connections as $client) {
        //循环所有的客户端连接数据
        //$client代表每一个用户的连接id
        //如果是同一个人
        if ($client == $frame->fd) {
            $result['style'] = 'bubble me';
        } else {
            $result['style'] = 'bubble you';
        }
        $data = [
            'msg' => '操作成功',
            'data' => $result,
            'error_code' => 0
        ];
        //push推送给客户端信息
        //进行广播,推送给所有用户
        $server->push($client, json_encode($data, 256));
    }
});
$server->on('close', function ($ser, $fd) {
    echo "client {$fd} closed\n";
});
$server->start();
相关文章
|
6月前
|
前端开发 网络协议 测试技术
探索PHP的异步编程模型:从React到Swoole
在Web开发领域,PHP一直以简单易用著称。然而,随着互联网应用对性能和并发处理能力的不断追求,传统的同步阻塞式编程模型已逐渐暴露出局限性。本文将深入探讨PHP中的异步编程模型,从早期的React到现代的Swoole,分析其原理、优势及应用场景,并通过实例展示如何利用这些工具提升PHP应用的性能和响应速度。文章旨在为PHP开发者提供一种全新的视角,帮助他们在构建高性能Web应用时做出更合理的技术选择。
77 0
|
3月前
|
缓存 程序员 PHP
为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
【9月更文挑战第8天】Swoole 被视为 PHP 程序员技术水平的分水岭,因为它要求程序员深入理解底层原理(如网络编程、异步和并发模型),具备性能优化能力(如高效服务器开发、数据库连接池管理),拥有架构设计能力(如微服务架构、项目复杂度管理),并具备持续学习和自我提升意识。熟练掌握 Swoole 的程序员在技术能力和综合素质方面更具优势。
|
4月前
|
Java PHP
【应用服务 App Service】在Azure App Service中使用WebSocket - PHP的问题 - 如何使用和调用
【应用服务 App Service】在Azure App Service中使用WebSocket - PHP的问题 - 如何使用和调用
|
4月前
|
人工智能 Go
Golang 搭建 WebSocket 应用(二) - 基本群聊 demo
Golang 搭建 WebSocket 应用(二) - 基本群聊 demo
46 1
|
3月前
|
缓存 网络协议 程序员
为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
【9月更文挑战第7天】Swoole 因其异步非阻塞编程模式、高性能服务器开发能力、性能优化工具及拓展技术视野等特点,被视为 PHP 程序员技术水平的分水岭。它要求程序员掌握异步编程、协程、网络协议等知识,并具备性能优化和系统管理能力,从而全面提升技术水平。
|
4月前
|
JavaScript 应用服务中间件 Go
PHP的异步编程:探索Swoole的奥秘
在传统的同步编程模型中,PHP的表现一直受到诟病。然而,随着Swoole的出现,PHP开发者得以迈入异步编程的新纪元。本文将深入浅出地介绍Swoole如何让PHP在性能和并发处理上实现飞跃,同时保持代码的简洁与优雅。
|
5月前
|
XML JSON Go
Swoole与Go系列教程之WebSocket服务的应用
在 WebSocket 协议出现之前,Web 应用为了能过获取到实时的数据都是通过不断轮询服务端的接口。轮询的效率、延时很低,并且很耗费资源。
1059 2
Swoole与Go系列教程之WebSocket服务的应用
|
7月前
|
网络协议 中间件 API
探索PHP的异步编程:Swoole框架的应用
在Web开发领域,PHP以其易用性和广泛的社区支持而闻名。然而,传统的PHP编程模型通常是同步的,这意味着在处理请求时,服务器必须等待任务完成才能响应。随着技术的发展,异步编程逐渐成为提升应用性能的关键。本文将深入探讨如何通过Swoole框架实现PHP的异步编程,从而优化并发处理能力,并提高应用的响应速度和扩展性。
|
6月前
|
网络协议 PHP
Swoole 源码分析之 WebSocket 模块
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。与传统的 HTTP 请求-响应模型不同,WebSocket 可以保持双向通信通道,从而使得服务器能够主动向客户端推送数据。
73 0
|
7月前
|
JavaScript PHP UED
【PHP开发专栏】PHP与WebSocket实时通信
【4月更文挑战第30天】本文介绍了PHP实现WebSocket实时通信的原理、使用方法和实际案例。WebSocket是基于HTTP的全双工通信协议,PHP 5.4以上版本支持WebSocket,可通过内置函数或第三方库如Socket.io、PHP-WebSocket来实现。文章详细展示了创建WebSocket服务器和客户端的PHP代码示例,并提及在PHP中使用Socket.io库进行实时通信。
361 2