在Angular项目使用socket.io实现通信的方法


Posted in Javascript onJanuary 05, 2021

step1、为项目安装依赖

在终端输入以下命令为我们的angular项目安装express、socket.io、socket.io-client

npm install express socket.io socket.io-client

本人安装的各版本信息如下:

"express": "^4.17.1",
"socket.io": "^3.0.4",
"socket.io-client": "^3.0.4",

step2、编写后台服务

可以在项目中新建一个server文件夹,用来存放我们的后台服务,然后新建文件

const app = require('express')();
const http = require('http').createServer(app);

const io = require('socket.io')(http, {
 cors: {  // 处理跨域问题
  origin: "http://localhost:4300", // angular项目的启动端口,默认4200,本人项目的启动端口为4300,大家根据自己情况修改
  methods: ["GET", "POST"],
  credentials: true
 }
});

io.on('connection', (socket) => {
 console.log('user connected');

 socket.on('add-message', (message) => {
  io.emit('message', {type: 'new-message', text: message});
 });
})

http.listen(4000, () => { // 后台服务启动端口
 console.log('start on 4000....');
})

step3、创建angular服务

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { io } from 'socket.io-client';

@Injectable()
export class ChatService {
 private url = 'http://localhost:4000'; // 后台服务端口
 private socket: any;

 sendMessage(message: any) {
  this.socket.emit('add-message', message);
 }

 getMessages(): Observable<any> {
  return new Observable(observer => {
   this.socket = io(this.url, {withCredentials: true});
   this.socket.on('message', (data) => {
    observer.next(data);
   });
   return () => {
    this.socket.disconnect();
   }
  })
 }
}

这里我们创建了两个方法,sendMessage用于将客户端的信息发送给服务端,getMessages用于建立连接,监听服务端事件并返回一个可观察的对象。

step4、创建组件

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ChatService } from './chat.service';

@Component({
 selector: 'test-chat',
 template: `<div *ngFor="let message of messages">
        {{message.text}}
       </div>
       <input [(ngModel)]="message" />
       <button (click)="sendMessage()">Send</button>`,
 providers: [ChatService] // 注入依赖
})
export class TestChatComponent implements OnInit, OnDestroy {
 messages = [];
 connection: any;
 message: any;

 constructor(private chatService: ChatService) {
 }

 sendMessage() {
  this.chatService.sendMessage(this.message);
  this.message = '';
 }

 ngOnInit() {
  this.connection = this.chatService.getMessages()
   .subscribe(message => {  // 组件初始化时订阅信息
    this.messages.push(message);
   });
 }

 ngOnDestroy() {
  this.connection.unsubscribe();  // 组件销毁取消订阅
 }
}

这样一个简单的socket通信就完成了,效果图如下:

启动服务

在Angular项目使用socket.io实现通信的方法

前端页面

在Angular项目使用socket.io实现通信的方法

在Angular项目使用socket.io实现通信的方法

如果遇到跨域问题,大概率是没有处理跨域,检查自己的代码和端口号是否正确,详情参考handing-cors

另外,如果遇到(本人遇到了,愣是在网上找了半天依然未果)
POST http://localhost:4000/socket.io/?EIO=3&transport=polling&t=NQtz_E3 400 (Bad Request)
这类的报错,npm安装socket.io-client(这也是为什么我在文章一开始就安装它),在service.ts文件引入

import { io } from 'socket.io-client';

在网上看到很多人是这样写的 import * as io from ‘socket.io-client',这种写法在typescript中是会报错的,改成上面的写法即可。

到此这篇关于在Angular项目使用socket.io实现通信的文章就介绍到这了,更多相关Angular使用socket.io实现通信内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery使用ColorBox弹出图片组浏览层实例演示
Mar 14 Javascript
jquery和css3实现的炫酷时尚的菜单导航
Sep 01 Javascript
JavaScript变量的作用域全解析
Aug 14 Javascript
jquery ztree异步搜索(搜叶子)实践
Feb 25 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
AngularJS 限定$scope的范围实例详解
Jun 23 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
vue组件内部引入外部js文件的方法
Jan 18 Javascript
JS轮播图的实现方法2
Aug 25 Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 Javascript
利用JavaScript为句子加标题的3种方法示例
Jan 05 #Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 #Javascript
详解JavaScript中分解数字的三种方法
Jan 05 #Javascript
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 #Vue.js
mapboxgl实现带箭头轨迹线的代码
Jan 04 #Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 #Vue.js
vue3弹出层V3Popup实例详解
Jan 04 #Vue.js
You might like
利用static实现表格的颜色隔行显示
2006/10/09 PHP
php读取3389的脚本
2014/05/06 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
php array_map()函数实例用法
2021/03/03 PHP
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
Python中的装饰器用法详解
2015/01/14 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
python的等深分箱实例
2019/11/22 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
Python join()函数原理及使用方法
2020/11/14 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
什么是反射
2012/03/17 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
妇产医师自荐信
2014/01/29 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
国庆节标语大全
2014/10/08 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
开票员岗位职责
2015/02/12 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
小型婚礼主持词
2015/06/30 职场文书
退休欢送会致辞
2015/07/31 职场文书
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL