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('think\swoole\Websocket'); // 单例 //获取当前发送消息客户端的 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('连接成功'); } ws.onmessage = function(data){ console.log(data.data); } ws.onclose = function(){ console.log('连接断开'); } function send() { var message = document.getElementById('message').value; var to = document.getElementById('to').value; console.log("准备给" + to + "发送数据:" + message); ws.send(JSON.stringify(['test',{ to:to, message:message }])); //发送的数据必须是 ['test',数据] 这种格式 } </script> </body> </html>
브라우저는 여러 탭을 열어 여러 클라이언트 연결을 시뮬레이션하고, 모두 test.html 파일에 액세스하고, 스테이션은 각 클라이언트의 fd를 인쇄합니다. 아래와 같이 액세스를 위해 세 개의 탭을 엽니다.
즉, 서버에서 보낸 메시지는 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('think\swoole\Websocket'); // 单例 //获取当前发送消息客户端的 fd var_dump($ws -> getSender()); //发送给指定 fd 的客户端,包括发送者自己 $ws -> to(intval($event['to'])) -> emit('testcallback',$event['message']); } }
$ws -> to()는 수신자 fd 또는 채팅방 이름을 설정하는 것입니다. 여러 사람을 배열로 설정할 수 있습니다(예: [1,2,3]). fd는 정수여야 합니다. $ws ->emit()은 메시지 전송 방법입니다. 첫 번째 매개변수는 이벤트 이름으로, 클라이언트가 메시지를 보내는 이전 기사의 테스트와 마찬가지로 여러 시나리오에서 사용되며 임의로 정의할 수 있습니다. 섬기는 사람. 두 번째 매개변수는 전송할 내용으로 문자열 또는 배열일 수 있습니다. 수신자를 설정하지 않고 별도로 호출하면 현재 fd로 메시지가 전송됩니다.
Think-Swoole 서비스를 다시 시작하고 연결을 위해 세 개의 클라이언트를 엽니다. fd는 각각 1, 2, 3입니다. 이제 fd 1을 사용하여 클라이언트에 fd 2를 사용하여 메시지를 보냅니다.
보내고 나면 fd 1과 2를 가진 클라이언트만 메시지를 받을 수 있는 반면(즉, 메시지를 보낸 사람도 메시지를 받게 됩니다) fd 3을 가진 클라이언트는 메시지를 받지 못하는 것을 볼 수 있습니다. message:
보내고 나면 fd 1과 2를 가진 클라이언트만 메시지를 받을 수 있는 반면(즉, 메시지를 보낸 사람도 메시지를 받게 됩니다) fd를 가진 클라이언트는 메시지를 받을 수 있음을 알 수 있습니다. 3 메시지를 받지 못하는 경우:
방송 메시지 보내기
방송 메시지는 자신을 제외한 모든 클라이언트에게 메시지를 보내는 것입니다.
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('testcallback',$event['message']); } }
$ws -> Broadcast() 메서드는 브로드캐스트 메시지를 보내는 것입니다.
하지만 브로드캐스트 메시지를 직접 받으려면 $ws -> to($ws -> getSender()) ->emit('testcallback',$event['message']) ; 그게 다야.
클라이언트가 다른 클라이언트에게 메시지를 보내는 것을 시뮬레이션합니다
현재 fd가 1이지만 fd 2가 있는 클라이언트를 사용하여 fd 3이 있는 클라이언트에 메시지를 보내는 것을 시뮬레이션하고 싶습니다. 송신자 fd와 수신자를 설정하기만 하면 됩니다. 두 개의 fd를 사용하세요.
$ws -> setSender(2) -> to(3) -> emit('testcallback',$event['message']);
테스트 후 1개는 메시지를 받지 못했지만 2개와 3개는 모두 메시지를 받았습니다.
Get SwooleWebSocketServer
이제 클라이언트가 유효한 클라이언트인지, 즉 서버와의 핸드셰이크가 성공적인지 확인하는 함수가 필요하다고 가정해 보겠습니다. Think-Swoole 확장에는 이 기능이 없지만 Swoole 공식 문서를 보면 필요한 기능을 완료할 수 있는 is Published 함수가 있으므로 Think-Swoole을 통해 기본 Swoole 기능을 얻는 방법은 다음과 같습니다. SwooleWebSocketServer 클래스. 두 가지 방법이 있습니다:
2.app('thinkswooleManager') -> getServer(); 인스턴스화 후 다음과 같은 Swoole 기본 메소드를 호출할 수 있습니다.
$manager = app('think\swoole\Manager'); $manager -> getServer() -> isEstablished(2);
첨부 파일: thinkSwooleWebsocket 클래스 객체 메소드:
broadcast 브로드캐스트 메시지 전송 설정
isBroadcast 현재 브로드캐스트 모드가
인지 확인 수신자 fd 또는 채팅방 이름 설정(에서 설정 가능) 배열 다중)
getTo 수신자 fd 또는 채팅방 이름 가져오기
join 현재 클라이언트가 지정된 채팅방에 참가합니다(여러 개가 될 수 있음)
leave 현재 클라이언트가 지정된 채팅방에서 나갑니다(여러 개가 될 수 있음). 다중이어야 함) )
emit 메시지 보내기
close 현재 연결을 닫습니다
getSender 현재 클라이언트 ID 가져오기(예: fd)
setSender 보낸 사람의 fd 설정
위 내용은 Think-Swoole의 WebSocket 메시지, 브로드캐스트 및 Swoole 기본 메소드 호출의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!