>  기사  >  PHP 프레임워크  >  Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

藏色散人
藏色散人앞으로
2020-10-19 14:52:283409검색

Think-Swoole 튜토리얼 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

클라이언트의 fd는 무엇입니까

fd는 Swoole에서 클라이언트의 고유 식별자입니다. fd는 새로 재사용됩니다. 입력된 연결은 재사용되며, 유지되는 TCP 연결 fd는 재사용되지 않습니다.

현재 클라이언트의 fd 가져오기

app/listener/WsConnect.php

<?php
declare (strict_types = 1);
namespace app\listener;
use \think\swoole\Websocket;
class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,Websocket $ws)
{
//        $ws = app(&#39;think\swoole\Websocket&#39;); // 单例
        //获取当前发送消息客户端的 fd
        var_dump($ws -> getSender());
    }
}

test.html

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
消息:<input type="text" id="message">
接收者:<input type="text" id="to">
<button onclick="send()">发送</button>
<script>
    var ws = new WebSocket("ws://127.0.0.1:9501/");
    ws.onopen = function(){
        console.log(&#39;连接成功&#39;);
    }
    ws.onmessage = function(data){
        console.log(data.data);
    }
    ws.onclose = function(){
        console.log(&#39;连接断开&#39;);
    }
    function send()
{
        var message = document.getElementById(&#39;message&#39;).value;
        var to = document.getElementById(&#39;to&#39;).value;
        console.log("准备给" + to + "发送数据:" + message);
        ws.send(JSON.stringify([&#39;test&#39;,{
            to:to,
            message:message
        }])); //发送的数据必须是 [&#39;test&#39;,数据] 这种格式
    }
</script>
</body>
</html>

브라우저는 여러 탭을 열어 여러 클라이언트 연결을 시뮬레이션하고, 모두 test.html 파일에 액세스하고, 스테이션은 각 클라이언트의 fd를 인쇄합니다. 아래와 같이 액세스를 위해 세 개의 탭을 엽니다.

Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

즉, 서버에서 보낸 메시지는 ws.onmessage에 의해 HTML로 수신됩니다.

지정된 fd의 클라이언트에게(단일 또는 그룹) 메시지 보내기

app/listener/WsTest.php

<?php
declare (strict_types = 1);
namespace app\listener;
use \think\swoole\Websocket;
class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,Websocket $ws)
{
//        $ws = app(&#39;think\swoole\Websocket&#39;); // 单例
        //获取当前发送消息客户端的 fd
        var_dump($ws -> getSender());
        //发送给指定 fd 的客户端,包括发送者自己
        $ws -> to(intval($event[&#39;to&#39;])) -> emit(&#39;testcallback&#39;,$event[&#39;message&#39;]);
    }
}

$ws -> to()는 수신자 fd 또는 채팅방 이름을 설정하는 것입니다. 여러 사람을 배열로 설정할 수 있습니다(예: [1,2,3]). fd는 정수여야 합니다. $ws ->emit()은 메시지 전송 방법입니다. 첫 번째 매개변수는 이벤트 이름으로, 클라이언트가 메시지를 보내는 이전 기사의 테스트와 마찬가지로 여러 시나리오에서 사용되며 임의로 정의할 수 있습니다. 섬기는 사람. 두 번째 매개변수는 전송할 내용으로 문자열 또는 배열일 수 있습니다. 수신자를 설정하지 않고 별도로 호출하면 현재 fd로 메시지가 전송됩니다.

Think-Swoole 서비스를 다시 시작하고 연결을 위해 세 개의 클라이언트를 엽니다. fd는 각각 1, 2, 3입니다. 이제 fd 1을 사용하여 클라이언트에 fd 2를 사용하여 메시지를 보냅니다.

Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

보내고 나면 fd 1과 2를 가진 클라이언트만 메시지를 받을 수 있는 반면(즉, 메시지를 보낸 사람도 메시지를 받게 됩니다) fd 3을 가진 클라이언트는 메시지를 받지 못하는 것을 볼 수 있습니다. message:

Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

보내고 나면 fd 1과 2를 가진 클라이언트만 메시지를 받을 수 있는 반면(즉, 메시지를 보낸 사람도 메시지를 받게 됩니다) fd를 가진 클라이언트는 메시지를 받을 수 있음을 알 수 있습니다. 3 메시지를 받지 못하는 경우:

Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출

방송 메시지 보내기

방송 메시지는 자신을 제외한 모든 클라이언트에게 메시지를 보내는 것입니다.

app/listener/WsConnect.php

<?php
declare (strict_types = 1);
namespace app\listener;
use \think\swoole\Websocket;
class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,Websocket $ws)
{
        //获取当前发送消息客户端的 fd
        var_dump($ws -> getSender());
        //发送广播消息
        $ws -> broadcast() -> emit(&#39;testcallback&#39;,$event[&#39;message&#39;]);
    }
}

$ws -> Broadcast() 메서드는 브로드캐스트 메시지를 보내는 것입니다.

하지만 브로드캐스트 메시지를 직접 받으려면 $ws -> to($ws -> getSender()) ->emit('testcallback',$event['message']) ; 그게 다야.

클라이언트가 다른 클라이언트에게 메시지를 보내는 것을 시뮬레이션합니다

현재 fd가 1이지만 fd 2가 있는 클라이언트를 사용하여 fd 3이 있는 클라이언트에 메시지를 보내는 것을 시뮬레이션하고 싶습니다. 송신자 fd와 수신자를 설정하기만 하면 됩니다. 두 개의 fd를 사용하세요.

$ws -> setSender(2) -> to(3) -> emit(&#39;testcallback&#39;,$event[&#39;message&#39;]);

테스트 후 1개는 메시지를 받지 못했지만 2개와 3개는 모두 메시지를 받았습니다.

Get SwooleWebSocketServer

이제 클라이언트가 유효한 클라이언트인지, 즉 서버와의 핸드셰이크가 성공적인지 확인하는 함수가 필요하다고 가정해 보겠습니다. Think-Swoole 확장에는 이 기능이 없지만 Swoole 공식 문서를 보면 필요한 기능을 완료할 수 있는 is Published 함수가 있으므로 Think-Swoole을 통해 기본 Swoole 기능을 얻는 방법은 다음과 같습니다. SwooleWebSocketServer 클래스. 두 가지 방법이 있습니다:

2.app('thinkswooleManager') -> getServer(); 인스턴스화 후 다음과 같은 Swoole 기본 메소드를 호출할 수 있습니다.

$manager = app(&#39;think\swoole\Manager&#39;);
$manager -> getServer() -> isEstablished(2);

첨부 파일: thinkSwooleWebsocket 클래스 객체 메소드:

broadcast 브로드캐스트 메시지 전송 설정

  • isBroadcast 현재 브로드캐스트 모드가

  • 인지 확인 수신자 fd 또는 채팅방 이름 설정(에서 설정 가능) 배열 다중)

  • getTo 수신자 fd 또는 채팅방 이름 가져오기

  • join 현재 클라이언트가 지정된 채팅방에 참가합니다(여러 개가 될 수 있음)

  • leave 현재 클라이언트가 지정된 채팅방에서 나갑니다(여러 개가 될 수 있음). 다중이어야 함) )

  • emit 메시지 보내기

  • close 현재 연결을 닫습니다

  • getSender 현재 클라이언트 ID 가져오기(예: fd)

  • setSender 보낸 사람의 fd 설정

위 내용은 Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 阿dai哥에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제