목차
프로젝트 소개
WebSocket 사용법" >WebSocket 사용법
PHP 프레임워크 Swoole webSocket과 Swoole을 사용하여 작은 대화방 만들기

webSocket과 Swoole을 사용하여 작은 대화방 만들기

Nov 09, 2020 pm 08:01 PM
swoole websocket

머리말

이번에는 소규모 채팅방을 만들기 위한 webSocket과 Swoole의 사용만 기록해 보겠습니다. 기능은 간단하지만 좋은 진입 사례로 사용할 수 있습니다.

프로젝트 소개

원래 아주 작은 케이스로 작성되었고, 기능적인 부분은 그렇게 많이 포함되어 있지 않아서 최소한의 구성만 따랐습니다.

  • 링크 상태, 현재 연결 성공 여부, 서버 연결 끊김 여부 등을 고려하면서 채팅 메시지를 표시할 수 있는 채팅 영역으로 프런트 엔드에서는 상황을 알 수 없습니다.

  • 입력 상자, 순수 입력 상자?

  • 보내기 버튼을 클릭해도 페이지가 새로 고쳐지지 않고, 현재 입력 상자의 내용이 지워지는 버튼일 뿐입니다. 전송이 지원되지 않습니다.

  • 메시지를 받으면 스크롤 막대가 자동으로 하단에 닿게 됩니다. 이 기능은 일부 사용 시나리오에서는 편리하지만 특정 시나리오에서는 사용하기 불편하기도 합니다. 수동으로 스크롤할 필요가 없다는 것입니다. 새로운 메시지가 있지만 불편한 점은 아마도 과거 뉴스를 보고 있는데 자동으로 바닥에 닿았을 수도 있다는 것입니다. 여전히 실제 필요에 따라 최적화해야 합니다.

  • 임의의 닉네임은 물론 저장하지 않아도 되며 새로고침하면 없어집니다. 메시지를 받았을 때 본인이 보낸 경우에는 [내가] 어떤 시간에 어떤 메시지를 보낸 것으로 표시됩니다. , 별명 문자열을 표시하는 대신.

프로젝트 환경

복사한 것을 직접 붙여넣기

composer create-project topthink/think tpcd tpcomposer require topthink/think-swoole
로그인 후 복사

테스트 프로젝트이기 때문에 기본적으로 모두 설치되어 있으므로 설치 후 프론트엔드 페이지에 접속하여 뷰 메소드를 이용하여 오류를 보고해주세요. Baidu에는 솔루션이 있습니다.

참조 문서: 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>
로그인 후 복사

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>
로그인 후 복사

Server code
서버는 프런트 엔드에서 메시지를 콜백하고 이를 객체 데이터로 변환한 다음 일부 사용자 정의 데이터를 추가하고 그대로 직접 반환하여 프런트 엔드에 대량으로 보내야 합니다.

<?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();
로그인 후 복사

코드가 완성된 후에는 콘솔에서 다음 PHP 파일을 실행하기만 하면 됩니다.

그런 다음 프런트 데스크에서 귀하의 웹사이트 주소에 직접 액세스합니다. 내 주소는 로컬 127.0.0.1

창을 몇 개 더 열어 여러 사용자를 시뮬레이션한 다음 메시지를 보내 테스트해 보세요.

안녕하세요, 이주 노동자 .

코드는 매우 간단하고 크게 어렵지는 않지만 webScoket과 Swoole의 위력을 매우 간결하게 반영할 수 있습니다.

위 내용은 webSocket과 Swoole을 사용하여 작은 대화방 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법 PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법 Dec 17, 2023 pm 10:24 PM

인터넷 기술의 지속적인 발전으로 실시간 커뮤니케이션은 일상생활에서 없어서는 안 될 부분이 되었습니다. WebSockets 기술을 사용하면 효율적이고 지연 시간이 짧은 실시간 통신이 가능하며, 인터넷 분야에서 가장 널리 사용되는 개발 언어 중 하나인 PHP도 해당 WebSocket 지원을 제공합니다. 이 기사에서는 PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까?

PHP 및 WebSocket: 실시간 데이터 전송 모범 사례 PHP 및 WebSocket: 실시간 데이터 전송 모범 사례 Dec 18, 2023 pm 02:10 PM

PHP 및 WebSocket: 실시간 데이터 전송을 위한 모범 사례 방법 소개: 웹 애플리케이션 개발에서 실시간 데이터 전송은 매우 중요한 기술 요구 사항입니다. 기존 HTTP 프로토콜은 요청-응답 모델 프로토콜이므로 실시간 데이터 전송을 효과적으로 달성할 수 없습니다. 실시간 데이터 전송 요구를 충족하기 위해 WebSocket 프로토콜이 탄생했습니다. WebSocket은 단일 TCP 연결을 통해 전이중 통신 방법을 제공하는 전이중 통신 프로토콜입니다. H에 비해

Java Websocket은 온라인 화이트보드 기능을 어떻게 구현합니까? Java Websocket은 온라인 화이트보드 기능을 어떻게 구현합니까? Dec 17, 2023 pm 10:58 PM

JavaWebsocket은 온라인 화이트보드 기능을 어떻게 구현합니까? 현대 인터넷 시대에 사람들은 실시간 협업과 상호작용 경험에 점점 더 많은 관심을 기울이고 있습니다. 온라인 화이트보드는 Websocket을 기반으로 구현된 기능으로, 여러 사용자가 실시간으로 협업하여 동일한 도면판을 편집하고 도면, 주석 등의 작업을 완료할 수 있는 편리한 솔루션을 제공합니다. 다른 시나리오. 1. 기술적 배경 WebSocket은 HTML5에서 제공하는 새로운 프로토콜을 구현합니다.

Laravel에서 Swoole 코루틴을 사용하는 방법 Laravel에서 Swoole 코루틴을 사용하는 방법 Apr 09, 2024 pm 06:48 PM

Laravel에서 Swoole 코루틴을 사용하면 많은 수의 요청을 동시에 처리할 수 있습니다. 장점은 다음과 같습니다. 동시 처리: 여러 요청을 동시에 처리할 수 있습니다. 고성능: Linux epoll 이벤트 메커니즘을 기반으로 요청을 효율적으로 처리합니다. 낮은 리소스 소비: 더 적은 서버 리소스가 필요합니다. 간편한 통합: Laravel 프레임워크와 원활하게 통합되어 사용이 간편합니다.

SSE 및 웹소켓 SSE 및 웹소켓 Apr 17, 2024 pm 02:18 PM

이 기사에서는 데이터를 전달하는 안정적인 방법인 SSE(Server Sent Events)와 WebSocket을 비교해 보겠습니다. 통신 방향, 기본 프로토콜, 보안, 사용 용이성, 성능, 메시지 구조, 사용 용이성, 테스트 도구 등 8가지 측면에서 분석합니다. 이러한 측면을 비교하면 다음과 같이 요약됩니다. 범주 서버 전송 이벤트(SSE) WebSocket 통신 방향 단방향 양방향 기본 프로토콜 HTTP WebSocket 프로토콜 보안 HTTP와 동일 기존 보안 취약점 사용 편의성 설정 간단한 설정 복잡한 성능 빠른 메시지 전송 속도 메시지 처리 및 연결 관리에 영향을 받음 메시지 구조 일반 텍스트 또는 바이너리 사용 용이성 널리 사용 가능 WebSocket 통합에 도움이 됨

Java 및 WebSocket을 사용하여 실시간 주식 시세 푸시를 구현하는 방법 Java 및 WebSocket을 사용하여 실시간 주식 시세 푸시를 구현하는 방법 Dec 17, 2023 pm 09:15 PM

Java 및 WebSocket을 사용하여 실시간 주식 시세 푸시를 구현하는 방법 소개: 인터넷의 급속한 발전으로 인해 실시간 주식 시세 푸시는 투자자들의 초점 중 하나가 되었습니다. 전통적인 주식시장 푸시 방식은 지연 시간이 길고 새로 고침 속도가 느린 등의 문제가 있으며, 투자자에게는 최신 주식 시장 정보를 적시에 얻을 수 없어 투자 결정에 오류가 발생할 수 있습니다. Java와 WebSocket을 기반으로 한 실시간 주식 시세 푸시는 이러한 문제를 효과적으로 해결하여 투자자가 최신 주가 정보를 최대한 빨리 얻을 수 있도록 해줍니다.

golang WebSocket 프로그래밍 팁: 동시 연결 처리 golang WebSocket 프로그래밍 팁: 동시 연결 처리 Dec 18, 2023 am 10:54 AM

Golang은 강력한 프로그래밍 언어이며 WebSocket 프로그래밍에서의 Golang 사용은 개발자들 사이에서 점점 더 가치가 높아지고 있습니다. WebSocket은 클라이언트와 서버 간의 양방향 통신을 허용하는 TCP 기반 프로토콜입니다. 이 기사에서는 Golang을 사용하여 동시에 여러 동시 연결을 처리하는 효율적인 WebSocket 서버를 작성하는 방법을 소개합니다. 기술을 소개하기 전에 먼저 WebSocket이 무엇인지 알아보겠습니다. WebSocket웹 소개

실시간 번역 기능 구현을 위한 PHP Websocket 개발 가이드 실시간 번역 기능 구현을 위한 PHP Websocket 개발 가이드 Dec 18, 2023 pm 05:52 PM

PHP 웹소켓 개발 가이드: 실시간 번역 기능 구현 소개: 인터넷이 발전하면서 다양한 애플리케이션 시나리오에서 실시간 통신이 점점 더 중요해지고 있습니다. 새롭게 떠오르는 통신 프로토콜인 Websocket은 실시간 통신을 훌륭하게 지원합니다. 이 기사에서는 PHP를 사용하여 Websocket 애플리케이션을 개발하는 방법과 실시간 번역 기능을 결합하여 특정 애플리케이션을 시연하는 방법에 대해 자세히 설명합니다. 1. 웹소켓 프로토콜이란 무엇입니까? 웹소켓 프로토콜은

See all articles