进阶在Angular应用中使用socket.io

Posted Angular完全开发手册

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进阶在Angular应用中使用socket.io相关的知识,希望对你有一定的参考价值。

我们已经知道如何在angular 中使用 websocket 和服务器进行交互。但是程序的健壮性不够,也有很多同学起node服务器的时候会遇到错误,难以解决。客户端代码中的websocket 代码也不够健壮,操作起来也不方便。本文介绍一种更好的方案: socket.io

首先,新建服务端文件夹 server。进入文件夹。

 
   
   
 
  1. npm init -y

  2. npm install --save socket.io

建立服务端入口文件 index.js

 
   
   
 
  1. const http = require('http');

  2. const io = require('socket.io');

  3. const httpServer = http.createServer((req, res) => {

  4.  res.end();

  5. });

  6. const ioserver = io(httpServer);

  7. ioServer.on('connection', socket => {

  8.  console.log('some one connected');

  9.  // 监听客户端推送的 'clientMessage' 事件

  10.  socket.on('clientMessage', msg => {

  11.    console.log(msg);

  12.    // 向客户端推送 'serverMessage' 事件。

  13.    socket.emit('serverMessage', msg);

  14.  });

  15. });

  16. httpServer.listen(

  17.  8080,

  18.  () => console.log('server started')

  19. );

先用 @angular/cli 新建项目,然后额外安装 socket.io 以及对应的 types。

 
   
   
 
  1. $ npm i --save socket.io

  2. $ npm i --save-dev @types/socket.io-client

新建 websocket 服务

 
   
   
 
  1. $ ng g s websocket -m app

代码:

 
   
   
 
  1. // websocket.service.ts

  2. import {Injectable} from '@angular/core';

  3. import * as SocketIO from 'socket.io-client';

  4. import {Subject} from 'rxjs/Subject';

  5. import {Observable} from 'rxjs/Observable';

  6. @Injectable()

  7. export class Websocket2Service {

  8.  io;

  9.  message$: Observable<string>;

  10.  private _message$ = new Subject<string>();

  11.  constructor() {

  12.    this.io = SocketIO('ws://localhost:8080');

  13.    this.io.emit('connection');

  14.    // 客户端在监听服务器推送的 'serverMessage'事件。

  15.    this.io.on('serverMessage', (msg) => this._message$.next(msg));

  16.    // 这里为什么进行额外的转换,请看历史文章: Rxjs 之 asObservable

  17.    this.message$ = this._message$.asObservable();

  18.  }

  19.  sendMessage(message: string) {

  20.    // 对比原生的websocket实现,你可以 emit 指定类型的事件,服务器只要在监听

  21.    // 你指定的事件,就会做响应的处理。普通的websocket 里则要通过的发送的信息中

  22.    // 添加额外的类型信息,服务器通过解析才知道这个请求对应的处理方式。

  23.    // 这里服务器在监听着 'clientMessage' 事件。

  24.    this.io.emit('clientMessage', message);

  25.  }

  26. }

在组件中使用

 
   
   
 
  1. import {Component, OnInit} from '@angular/core';

  2. import {WebsocketService} from './websocket.service';

  3. @Component({

  4.  selector: 'app-root',

  5.  template: `

  6.    <ul>

  7.      <li *ngFor="let msg of messages">{{msg}}</li>

  8.    </ul>

  9.    <p *ngIf="error">{{error | json}}</p>

  10.    <p *ngIf="completed">completed!</p>

  11.    <input type="text"

  12.           #message>

  13.    <button (click)="send(message.value);message.value='';">send</button>

  14.  `,

  15.  styleUrls: ['./app.component.css']

  16. })

  17. export class AppComponent implements OnInit {

  18.  messages = [];

  19.  error: any;

  20.  completed = false;

  21.  constructor(private websocketService: WebsocketService) {

  22.  }

  23.  ngOnInit(): void {

  24.    this.websocketService.message$.subscribe(

  25.      msg => {

  26.        console.log(msg);

  27.        this.messages.push(msg);

  28.      }

  29.    );

  30.  }

  31.  send(message: string) {

  32.    this.websocketService.sendMessage(message);

  33.  }

  34. }

运行截图:


以上是关于进阶在Angular应用中使用socket.io的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 2 应用程序中导入 socket.io-client 时出错 [重复]

如何使用 Angular 和 Jasmine 模拟 socket.io

如何在 Angular 2 应用程序中导入 socket.io-client?

使用 Angular 的单页应用程序引擎时依赖 socket.io/express.io 中的“断开连接”事件

带有 socket.io 和后端 php 的 Angular

在 socket.io 中使用 Angular