gpt4 book ai didi

node.js - 在NestJs中使用Socket IO加入并发布到房间

转载 作者:行者123 更新时间:2023-12-03 11:58:41 25 4
gpt4 key购买 nike

我正在尝试使用socketio在nestjs中创建一个简单的房间,并且无法掌握房间的概念。我想要的是客户端将ID发送到通用端点,然后服务器将该套接字连接到特定房间,然后开始从其他位置向该房间发送消息。我目前所拥有的是客户加入一个称为“ session ”的事件,然后被发送到虚假 session ,但是我无法弄清楚如何让多个客户加入同一个 session 室并一次发送相同的信息。
客户端(html)

  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.1/socket.io.js"></script>
<script>
const url = 'http://localhost:4001';
const socket = io(url);
socket.on('connect', function() {
console.log('Connected');
socket.emit('meeting', { roomId: '12345' });
});
socket.on('meeting', function(data) {
console.log('you have joined the meeting: ', data);
});
socket.on('exception', function(data) {
console.log('event', data);
});
socket.on('disconnect', function() {
console.log('Disconnected');
});
</script>
服务器(NestJS):
@WebSocketGateway(4001)
export class PackGateway implements OnGatewayConnection {

constructor(private otherService: OtherService) {}

@WebSocketServer()
server: Server;

handleConnection() {
console.log('new connection!');
}

@SubscribeMessage('meeting')
joinUserToMeeting(@MessageBody() data: any, @ConnectedSocket() client: Socket): Observable<WsResponse<any>> {
client.join(data.roomId, (err) => {
if (err) {
console.log('error ', err);
} else {
console.log('client joined room: ' + data.roomId);
this.server.to(data.meetingId).emit('a new challenger approaches');
}
});
return from(data.meetingId)
.pipe(
map(
(res: any) => {
return {
event: 'meeting',
data: data.meetingId
}
}
)
);
}
}
通过此设置,我的客户将连接到 session 事件,被连接到他们在连接 session 事件时发送的roomId,并被发送回他们已加入的MeetingId。但是我错过了一件关键的事情:
  • 客户端实际上尚未在服务器加入该房间的房间中打开连接。我是否需要在客户端代码中执行此操作才能启动与特定房间ID的连接?一旦我可以使以下内容正常工作,我想我的客户端会在任何客户端加入后收到一条消息,因为建立新连接后服务器会向该房间发出消息。
  •     <script>
    const url = 'http://localhost:4001';
    const socket = io(url);
    socket.on('connect', function () {
    console.log('Connected');
    socket.emit('meeting', { meetingId: '12345' });
    });
    socket.on('meeting', function (data) {
    console.log('you have joined the meeting: ', data);
    socket.in(data).on('roomIdEvent', function (data) {
    console.log('you got a new event specific to the meeting you joined');
    console.log('data');
    });
    });
    socket.on('exception', function (data) {
    console.log('event', data);
    });
    socket.on('disconnect', function () {
    console.log('Disconnected');
    });
    </script>

    最佳答案

    意识到当我的服务器发射到那个房间时,我没有正确构造消息:
    所以

    this.server.to(data.meetingId).emit('a new challenger approaches');
    this.server.to(data.meetingId).emit('meeting', 'a new challenger approaches');
    现在由于我的服务器已将客户加入该 session 室,因此通过 session 室发送到 session 允许我的客户查看数据

    关于node.js - 在NestJs中使用Socket IO加入并发布到房间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64470937/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com