Socket.io 广播到房间不工作

Posted

技术标签:

【中文标题】Socket.io 广播到房间不工作【英文标题】:Socket.io broadcast to room not working 【发布时间】:2018-08-08 13:46:17 【问题描述】:

在使用 "socket.io": "^2.0.4" 的 node.js 应用程序中

Socket.io 是这样初始化的:

export let io: any;

 io = socketio(server,
    
      secure: secure,
      rejectUnauthorized: false,
    ,
  );

  io.set('origins', '*:*');
  io.origins('*:*');

  io.on('connection', (socket) => 
  socket.on('message', async (data) => 
    
  

我想将message 广播到房间中的所有套接字

所以我做到了:

io.to(roomName).emit('message', data);

我在 io().to().emit() 之后登录,房间名和数据都没有问题

但是message 没有事件通过,我错过了什么?

【问题讨论】:

代码太少,无法察觉问题。 【参考方案1】:

您的 sockect.IO 是否在服务器端正确配置,这是一个基于 rxjs 的低级套接字服务 api,适用于 Angular,您可以使用

import  Injectable  from '@angular/core';
import * as socketio from 'socket.io-client';
import environment from '../../../environments/environment';
import Observable from 'rxjs/Observable';
import BehaviorSubject from 'rxjs/BehaviorSubject';

@Injectable()
export class SocketService 

  private socket: SocketIOClient.Socket;
  connected$ = new BehaviorSubject<boolean>(false);

  constructor() 
    this.socket = socketio(environment.socket.baseUrl, environment.socket.config);
    this.socket.on('connect', () => this.connected$.next(true));
    this.socket.on('disconnect', () => this.connected$.next(false));
  

  join(room: string) 
    // auto rejoin after reconnect mechanism
    this.connected$.subscribe(connected => 
      if (connected) 
        this.socket.emit('join', room);
      
    );
  

  disconnect() 
    this.socket.disconnect();
    this.connected$.next(false);
  

  emit(event: string, data?: any) 

    console.group();
      console.log('----- SOCKET OUTBAND -----');
      console.log('Action: ', event);
      console.log('Payload: ', data);
    console.groupEnd();

    this.socket.emit(event, data);
  

  listen(event: string): Observable<any> 
    return new Observable( observer => 

      this.socket.on(event, data => 

        console.group();
          console.log('----- SOCKET INBOUND -----');
          console.log('Action: ', event);
          console.log('Payload: ', data);
        console.groupEnd();

        observer.next(data);
      );
      // dispose of the event listener when unsubscribed
      return () => this.socket.off(event);
    );
  


这段代码来自 Avatsaev,感谢他分享了他使用 NGRX 使用 socket Io 的酷应用,你可以看到它是如何与his service code一起使用的

【讨论】:

问题是,我也在服务器端配置了 socketIo 并且已经使用它来处理简单的套接字到套接字消息或套接字到房间没有问题。但在这种情况下io to room 我无法让它工作,我不明白为什么。【参考方案2】:

试试下面的代码:

socket.broadcast.to(roomName).emit('message', data);

更多信息:https://socket.io/docs/emit-cheatsheet/#

【讨论】:

我无法使用该方法,因为我必须在 io 之外进行调用。广播不是来自套接字【参考方案3】:

对于遇到类似问题的任何人,请确保将消息发送到正确的命名空间。在我的例子中,我需要发送到所有客户端都在监听的“聊天”命名空间,但只是发送到一个特定的房间。

例如:

// We still need to specify the namespace, in my case, the "chat" namespace. This is where my clients are listening.
socket.on("special-message", (message) => 
  console.log("Special message is: ", message);
  socket.to("special").emit("chat", message); // Emit to "special" channel inside the "chat" namespace.
);

【讨论】:

嗯...“聊天”这里是事件名称,而不是命名空间

以上是关于Socket.io 广播到房间不工作的主要内容,如果未能解决你的问题,请参考以下文章

socket io 广播、房间和确认功能

socket io 广播、房间和确认功能

socket.io 只向房间 A 和 B 中的用户广播

带有 Socket.io 和 Node 的动态房间

使用Socket.io将消息发送到多个房间?

socket.io 入门篇