我创建了两个服务 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的最佳结构是什么?
答案 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