当服务器将事件发送到特定客户端时,不要使用Angular2来运行socket.io-client(不同的angular2服务)

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

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); } } 

receive-message.service.ts

 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'); }) }) } 

发送消息getMessage事件在相同的服务服务器代码和客户端代码中,一切都按照我的预期完美工作。 但如果这些事件放在不同的服务中,我不能发射事件两个特定的客户端。 只有io.emit('getMessage', 'msg')socket.emit('getMessage', 'msg')正常工作。 我在用:

Angula2 v4.3.1

 "@types/socket.io-client": "1.4.30", "socket.io-client": "2.0.3", "socket.io": "2.0.3", 

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

套接字join和发送事件给特定用户的服务器端代码非常好。 但是在客户端,在两种不同的服务中有两个不同的套接字实例。 已在SendMessageService中创build的套接字的第一个实例(与ReceiveMessageService中的套接字和另一个新的套接字实例连接)不相同 。 所以它不会像预期那样广播事件。 为了使它在两个sockets中工作

 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); } 

应该是套接字的同一个实例。虽然angular度组件或模块不同,那么将使用getMessagesaveUser服务方法应该使用通用服务或全局服务。

要创build全球服务,请点击“创build全球服务”链接