Jadual Kandungan
项目简介
webSocket 的使用" >webSocket 的使用
Rumah rangka kerja php Swoole 利用webSocket与Swoole打造一个小型聊天室

利用webSocket与Swoole打造一个小型聊天室

Nov 09, 2020 pm 08:01 PM
swoole websocket

前言

    本次仅记录 webSocket 与 Swoole 配合打造一个小型的聊天室,功能简陋,但是可以作为一个很好的入门案例。

项目简介

    本来就是作为一个很小的案例来写的,包含的功能点也不是那多,索性就按照最最最低配置来搞。

  • 能够显示聊天消息的聊天区,同时兼顾显示链接状态,当前是否连接成功,或者服务端是否断开连接,而前端不知道的状况。

  • 一个输入框,纯粹的输入框 ?

  • 点击按钮发送不刷新页面,同时清空当前输入框内容,就简单的一个 button 而已,点击执行,不支持回车发送。

  • 收到消息,滚动条自动触底,这个功能在某些使用场景是方便的,但又会造成某些场景使用不方便,方便在于有新消息不需要人工滚动,不方便在于,可能你在看历史消息,它自动触底了…还需要根据自己实际需求优化一下下。

  • 随机昵称,当然不需要保存,刷新即丢,在收到消息如果是自己发送的,则显示 [ 我 ] 在某某时候发送了某某消息,而不是显示昵称字符串。

项目环境

直接粘贴复制的

composer create-project topthink/think tpcd tpcomposer require topthink/think-swoole
Salin selepas log masuk

因为是测试项目,所有的都是默认安装,在安装完之后,访问前端页面,使用 view 方法会报错,百度一下就有解决方案了。

参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

  1. onopen() 发起连接,连接成功后执行。
  2. onclose() 连接断开后执行。
  3. onmessage() 收到服务端消息后执行。
  4. onerror() 服务器异常执行。
    其实,webSocket 就这些常用方法,也没啥特殊要求的,他就是作为一个保持连接,接收服务器状态的一个浏览器的 API 存在,非常简洁方便。

前端页面代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>打工人聊天室</title>   <!--需要引入jq 文件--></head><style>    .content {        height: 400px;        max-width: 400px;        overflow: auto;        border-radius: 5px;        border: 1px solid #f0f0f0;    }</style><body>            <div id="content" class="content">                <p>聊天区域</p>            </div>            你好打工人:<samp id="nickname">昵称</samp> <br>            本次连接FD: <samp id="fd-samp"></samp> <br>            <input type="text" id="msg">            <input type="hidden" id="fd" value="">            <button id="send" onclick="send()">发送</button></body></html>
Salin selepas log masuk

JS 代码:

在服务器信息回执时,会有第一次连接回执,还是服务端发送消息回执的状态区别,通过 msgType 来分辨,如果是第一次连接的回执消息,则把 FD 做一个页面留存,并不显示在聊天消息区,如果收到的是消息回执,就直接显示到聊天消息区。

还有就是,前后端相互通信发送的东西,都是字符串性质最优,我前端处理的方法是先组合成一个对象,然后转 JSON 串。

<script>    //滚动条最底部    function scrolltest() {        var div = document.getElementById("content");        div.scrollTop = div.scrollHeight;    }    var wsServer = &#39;ws://127.0.0.1:9502&#39;;    var websocket = new WebSocket(wsServer);    var nickname = Math.random().toString(36).substr(2);    thisFd = &#39;&#39;;    $(&#39;#nickname&#39;).html(nickname);    //点击发送    function send() {        var msg = $(&#39;#msg&#39;).val();        var data = {            &#39;nickname&#39;: nickname,            &#39;fd&#39;: thisFd,            &#39;data&#39;: msg        }        //生成json 方便后台接收以及使用        var data = JSON.stringify(data);        websocket.send(data);        //然后清空        $(&#39;#msg&#39;).val(&#39;&#39;);    }    //链接成功    websocket.onopen = function (evt) {        $("#content >p:last-child").after(&#39;<p> 服务器已连接,开始聊天吧 </p>&#39;);    };    //链接断开    websocket.onclose = function (evt) {        $("#content >p:last-child").after(&#39;<p> 服务器已断开,请重新连接 </p>&#39;);    };    //收到服务器消息    websocket.onmessage = function (evt) {        //握手成功后,会接受到服务端返回的fd ,msgType = 1        //字符串格式化成json        var data = eval(&#39;(&#39; + evt.data + &#39;)&#39;);        // console.log(evt.data);        switch (data.msgType) {            case 1:                thisFd = data.fd;                $(&#39;#fd-samp&#39;).html(thisFd);                $(&#39;#fd&#39;).val(thisFd);                break;            case 2:                if (data.nickname == nickname) {                    data.nickname = &#39;我&#39;;                }                $("#content >p:last-child").after(&#39;<p>&#39; + data.nickname + &#39; 在 &#39; + data.time + &#39; 说:<br>&#39; + data.data + &#39;</p>&#39;);                //接收到消息自动触底                scrolltest();                break;        }    };    //服务器异常    websocket.onerror = function (evt, e) {        $("#content >p:last-child").after(&#39;<p> 服务器异常 </p>&#39;);    };</script>
Salin selepas log masuk

服务端代码
服务端需要 callback 前端过来的消息,转成对象数据,然后增加点自定义数据直接原样返回,并且群发到前端。

<?php    //创建WebSocket Server对象,监听0.0.0.0:9502端口    $ws = new Swoole\WebSocket\Server(&#39;0.0.0.0&#39;, 9502);    //监听WebSocket连接打开事件    $ws->on(&#39;open&#39;, function ($ws, $request){        $fd = $request->fd;        $data = json_encode([            &#39;fd&#39; => $request->fd,            &#39;msgType&#39; => 1  //代表第一次连接,前端处理fd        ]);        $ws->push($request->fd, $data);    });    //监听WebSocket消息事件    $ws->on(&#39;message&#39;, function ($ws, $frame) {        $stats = $ws->stats();        //格式化接收到json        $data = json_decode($frame->data);        // 原基础上不动,增加一些自定义        $data->msgType = 2; //代表服务器端回复        $data->time = date(&#39;Y-m-d H-i-s&#39;);        $data = json_encode($data);        //因为是聊天室,所以包括自己都需要收到回执,就直接群发 swoole 提供 connections 方法 包含了所有在线的 fd        foreach ($ws->connections as $conn_fd){            $ws->push($conn_fd,$data);        }    });    //监听WebSocket连接关闭事件    $ws->on(&#39;close&#39;, function ($ws, $fd) {//        echo "client-{$fd} is closed\n";    });    $ws->start();
Salin selepas log masuk

代码齐全之后,接下来就只需要在控制台执行以下 PHP 文件就行。

然后前台直接访问你的网站地址,我的是本地 127.0.0.1

多开几个窗口模拟多个用户,然后发送消息测试即可:

你好,打工人。

代码很简单,难度不大,但是可以很简洁的反应出 webScoket 和 Swoole 的一种强大。

Atas ialah kandungan terperinci 利用webSocket与Swoole打造一个小型聊天室. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mencapai komunikasi masa nyata menggunakan PHP dan WebSocket Bagaimana untuk mencapai komunikasi masa nyata menggunakan PHP dan WebSocket Dec 17, 2023 pm 10:24 PM

Dengan perkembangan teknologi Internet yang berterusan, komunikasi masa nyata telah menjadi bahagian yang amat diperlukan dalam kehidupan seharian. Komunikasi masa nyata yang cekap, kependaman rendah boleh dicapai menggunakan teknologi WebSockets, dan PHP, sebagai salah satu bahasa pembangunan yang paling banyak digunakan dalam bidang Internet, juga menyediakan sokongan WebSocket yang sepadan. Artikel ini akan memperkenalkan cara menggunakan PHP dan WebSocket untuk mencapai komunikasi masa nyata, dan menyediakan contoh kod khusus. 1. Apakah itu WebSocket?

PHP dan WebSocket: Amalan terbaik untuk pemindahan data masa nyata PHP dan WebSocket: Amalan terbaik untuk pemindahan data masa nyata Dec 18, 2023 pm 02:10 PM

PHP dan WebSocket: Kaedah Amalan Terbaik untuk Pemindahan Data Masa Nyata Pengenalan: Dalam pembangunan aplikasi web, pemindahan data masa nyata merupakan keperluan teknikal yang sangat penting. Protokol HTTP tradisional ialah protokol model tindak balas permintaan dan tidak boleh mencapai penghantaran data masa nyata dengan berkesan. Untuk memenuhi keperluan penghantaran data masa nyata, protokol WebSocket telah wujud. WebSocket ialah protokol komunikasi dupleks penuh yang menyediakan cara untuk berkomunikasi dupleks penuh melalui sambungan TCP tunggal. Berbanding dengan H

Bagaimanakah Java Websocket melaksanakan fungsi papan putih dalam talian? Bagaimanakah Java Websocket melaksanakan fungsi papan putih dalam talian? Dec 17, 2023 pm 10:58 PM

Bagaimanakah JavaWebsocket melaksanakan fungsi papan putih dalam talian? Dalam era Internet moden, orang ramai memberi lebih banyak perhatian kepada pengalaman kerjasama dan interaksi masa nyata. Papan putih dalam talian ialah fungsi yang dilaksanakan berdasarkan Websocket Ia membolehkan berbilang pengguna bekerjasama dalam masa nyata untuk mengedit papan lukisan yang sama dan menyelesaikan operasi seperti lukisan dan anotasi. Ia menyediakan penyelesaian yang mudah untuk pendidikan dalam talian, mesyuarat jarak jauh, kerjasama pasukan dan senario lain. 1. Latar belakang teknikal WebSocket ialah protokol baharu yang disediakan oleh HTML5

SSE dan WebSocket SSE dan WebSocket Apr 17, 2024 pm 02:18 PM

Dalam artikel ini, kami akan membandingkan Acara Dihantar Pelayan (SSE) dan WebSockets, kedua-duanya adalah kaedah yang boleh dipercayai untuk menyampaikan data. Kami akan menganalisisnya dalam lapan aspek, termasuk arah komunikasi, protokol asas, keselamatan, kemudahan penggunaan, prestasi, struktur mesej, kemudahan penggunaan dan alat ujian. Perbandingan aspek-aspek ini diringkaskan seperti berikut: Kategori Peristiwa Dihantar Pelayan (SSE) WebSocket Arah Komunikasi Sehala Dwi-arah Protokol Pendasar HTTP WebSocket Protocol Keselamatan Sama seperti HTTP Kerentanan keselamatan sedia ada Kemudahan penggunaan Tetapan Tetapan mudah Prestasi kompleks Kelajuan penghantaran mesej pantas Dijejaskan oleh pemprosesan mesej dan pengurusan sambungan Struktur mesej Teks biasa atau binari Kemudahan penggunaan Tersedia secara meluas Berguna untuk penyepaduan WebSocket

Cara menggunakan coroutine swoole dalam laravel Cara menggunakan coroutine swoole dalam laravel Apr 09, 2024 pm 06:48 PM

Menggunakan coroutine Swoole dalam Laravel boleh memproses sejumlah besar permintaan secara serentak. Kelebihannya termasuk: Pemprosesan serentak: membolehkan berbilang permintaan diproses pada masa yang sama. Prestasi tinggi: Berdasarkan mekanisme acara epoll Linux, ia memproses permintaan dengan cekap. Penggunaan sumber yang rendah: memerlukan lebih sedikit sumber pelayan. Mudah untuk disepadukan: Penyepaduan lancar dengan rangka kerja Laravel, mudah digunakan.

golang Petua pengaturcaraan WebSocket: mengendalikan sambungan serentak golang Petua pengaturcaraan WebSocket: mengendalikan sambungan serentak Dec 18, 2023 am 10:54 AM

Golang ialah bahasa pengaturcaraan yang berkuasa, dan penggunaannya dalam pengaturcaraan WebSocket semakin dihargai oleh pembangun. WebSocket ialah protokol berasaskan TCP yang membenarkan komunikasi dua hala antara klien dan pelayan. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Golang untuk menulis pelayan WebSocket yang cekap yang mengendalikan berbilang sambungan serentak pada masa yang sama. Sebelum memperkenalkan teknik, mari kita pelajari dahulu apa itu WebSocket. Pengenalan kepada WebSocketWeb

Cara menggunakan Java dan WebSocket untuk melaksanakan push sebut harga saham masa nyata Cara menggunakan Java dan WebSocket untuk melaksanakan push sebut harga saham masa nyata Dec 17, 2023 pm 09:15 PM

Cara menggunakan Java dan WebSocket untuk melaksanakan push sebut harga saham masa nyata Pengenalan: Dengan perkembangan pesat Internet, push sebut harga saham masa nyata telah menjadi salah satu tumpuan pelabur. Kaedah tolakan pasaran saham tradisional mempunyai masalah seperti kelewatan yang tinggi dan kelajuan penyegaran yang perlahan Bagi pelabur, ketidakupayaan untuk mendapatkan maklumat pasaran saham terkini tepat pada masanya boleh menyebabkan kesilapan dalam keputusan pelaburan. Tolakan sebut harga saham masa nyata berdasarkan Java dan WebSocket boleh menyelesaikan masalah ini dengan berkesan, membolehkan pelabur mendapatkan maklumat harga saham terkini secepat mungkin.

Panduan pembangunan PHP Websocket untuk melaksanakan fungsi terjemahan masa nyata Panduan pembangunan PHP Websocket untuk melaksanakan fungsi terjemahan masa nyata Dec 18, 2023 pm 05:52 PM

Panduan Pembangunan Soket Web PHP: Melaksanakan Fungsi Terjemahan Masa Nyata Pengenalan: Dengan perkembangan Internet, komunikasi masa nyata menjadi semakin penting dalam pelbagai senario aplikasi. Sebagai protokol komunikasi yang baru muncul, Websocket menyediakan sokongan yang baik untuk komunikasi masa nyata. Artikel ini akan membawa anda melalui pemahaman terperinci tentang cara menggunakan PHP untuk membangunkan aplikasi Websocket, dan menggabungkan fungsi terjemahan masa nyata untuk menunjukkan aplikasi khususnya. 1. Apakah protokol Websocket? Protokol Websocket ialah a

See all articles