[code] <!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button οnclick="join()">加入房间</button>
<button οnclick="leave()">离开房间</button>
<input type="text" id="message">
<button οnclick="send()">发送</button>
<script src="https://cdn.socket.io/socket.io-1.4.4.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
//http 协议
var socket = io("http://*********:端口号?uid=1", {transports: ['websocket']});
socket.on('connect', function(){
console.log('connect success');
});
//testcallback 为自定义的场景值,和后端对应
socket.on("roomjoincallback", function (data) {
console.log(data)
});
socket.on("roomleavecallback", function (data) {
console.log(data)
});
socket.on("roommessagecallback", function (data) {
console.log(data)
});
function join()
{
var room = prompt('请输入房间号');
socket.emit("Join",{room : room});
}
function leave()
{
var room = prompt('请输入要离开的房间号');
socket.emit('leave',{
room : room
});
}
function send()
{
var message = document.getElementById('message').value;
var room = prompt('请输入接收消息的房间号')
socket.emit('Message',{
message : message,
room : room
});
}
</script>
</body>
</html>[/code]
不能触发自定义的 但是 Connect Message Close 能触发能即受到消息
[code]<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
// 监听链接
'swoole.websocket.Connect' => [
\app\listener\LiveRoomConnect::class
],
//关闭连接
'swoole.websocket.Close' => [
\app\listener\LiveRoomClose::class
],
// 加入房间
'swoole.websocket.Join' => [
\app\listener\LiveRoomJoin::class
],
// 离开房间
'swoole.websocket.leave' => [
\app\listener\LiveRoomLeave::class
],
//发送消息场景
'swoole.websocket.Message' => [
\app\listener\LiveRoomMessage::class
],
],
'subscribe' => [
],
];
[/code]
[code]
<?php
declare (strict_types = 1);
namespace app\listener;
use think\swoole\Websocket;
use think\swoole\websocket\room;
use think\log;
class LiveRoomJoin
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event, Websocket $ws, room $room)
{
Log::channel('email')->info('一条测试日志');
$fd = $ws->getSender();
//客户端假如定的room
$roomid = $event['room'];
//获取指定房间下有哪些客户端
$roomfds = $room->getClients($roomid);
// 判断这个房间有没有自己 如果有自己就不需要再次发送通知
if (in_array($fd, $roomfds)) {
$ws->to($roomfds)->emit("roomjoincallback", "房间{$roomid}已加入");
return;
}
//加入房间
$ws->join($roomid);
$ws->to($roomfds)->emit("roomjoincallback", "{$fd}加入房间{$roomid}成功");
}
}
[/code]