当服务器向特定客户端发出事件时,不使用Angular2的socket.io-client(不同的angular2服务)

时间:2017-09-22 06:45:39

标签: node.js angular sockets angular-cli

我创建了两个服务 send-message.service.ts

lists

receive-message.service.ts

if( (arr[i].listId == lists[j].listId) && (arr[i].permission == lists[j].permission) )

我的服务器代码如下所示:

import { Injectable } from "@angular/core";
import * as io from 'socket.io-client';

@Injectable()
export class SendMessageService {

  private url = 'http://localhost:4000';
  private socket = io(this.url);

  saveUser(user) {
    this.socket.emit('joining-to-chat', user);
  }

  sendMessage(data) {
    this.socket.emit('send-message', data);
  }

}

发送消息 getMessage 事件在同一服务服务器代码和客户端代码中时,一切都完美地符合我的期望。但是如果这些事件放在不同的服务中我就不能发出事件两个特定的客户端。只有import { Injectable } from "@angular/core"; import { Subject } from 'rxjs/Subject'; import { Observable } from 'rxjs/Observable'; import * as io from 'socket.io-client'; @Injectable() export class ReceiveMessageService { private url = 'http://localhost:4000'; private socket = io(this.url); getMessage() { let observable = new Observable(observer => { this.socket.on('getMessage', (data) => { observer.next(data); }); return () => { this.socket.disconnect(); }; }) return observable; } } export default (io) => { io.on('connect', (socket) => { var users = []; socket.on('send-message', (data) => { io.sockets.in(data.message_to).emit('getMessage', { text: data.message, from: data.message_from }) }) socket.on('joining-to-chat', (data) => { socket.join(data.username); users.push(data.username); io.emit('new-user', users) }) socket.on('disconnect', () => { console.log('a user disconnected'); }) }) } 正常工作。我正在使用:

Angula2 v4.3.1

io.emit('getMessage', 'msg')

我想知道如何在angular2中使用socket.io-client,当我的应用程序包含许多不同的独立模块和服务时,socket.io-client的最佳结构是什么?

1 个答案:

答案 0 :(得分:0)

套接字加入和向特定用户发出事件的服务器端代码非常好。 但在客户端,在两个不同的服务中有两个不同的套接字实例。 已在 SendMessageService 中创建的socket的第一个实例与 ReceiveMessageService 中的另一个新套接字实例相同。因此它不会按预期广播事件。

中的两个插座使其可行
getMessage() {
    let observable = new Observable(observer => {
      this.socket.on('getMessage', (data) => {
        observer.next(data);
      });
      return () => {
        this.socket.disconnect();
      };
    })
    return observable;
  }

saveUser(user) {
   this.socket.emit('joining-to-chat', user);
  }

应该是相同套接字的实例。虽然角度组件或模块不同,但它们将使用 getMessage saveUser 服务方法应该使用共同服务或全球服务。

要创建全球服务,请点击链接Making global service