Socket.io广播到房间不起作用

4
在一个使用"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) => {
    }
  }

我希望能够向房间内的所有socket广播消息,因此我做了以下操作:

代码:

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

我在使用 io().to().emit() 后记录了房间名称和数据,没有问题。

但是 message 中没有传递事件,我错过了什么吗?


代码太少,无法察觉问题。 - Munim Munna
3个回答

4

您的服务器端的Socket.IO配置是否正确?这里有一个基于rxjs的低级socket服务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,感谢他分享了使用socket Io和NGRX的酷炫应用程序,您可以查看他的服务代码以了解如何使用。


事情是这样的,我在服务器端配置了socketIo,并且已经在简单的socket到socket消息或socket到room上使用它,没有任何问题。但是在这种情况下,“io到房间”的情况我无法让它工作,我也不知道原因在哪里。 - An-droid

0

1
我无法使用该方法,因为我必须在io之外进行调用。广播不是来自套接字。 - An-droid

0
对于任何遇到类似问题的人,请确保将消息发射到正确的命名空间。在我的情况下,我需要发射到"chat"命名空间,所有客户端都在那里监听,但只针对特定房间。
例如:
// 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.
});

1
嗯...这里的“chat”是事件名称,而不是命名空间。 - Goon Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接