在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 相关文章推荐
JavaScript使用技巧精萃[代码非常实用]
Nov 21 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
JavaScript中的函数模式详解
Feb 11 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
Mar 13 Javascript
JavaScript encodeURI 和encodeURIComponent
Dec 04 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
Jan 21 Javascript
深入理解Angular2 模板语法
Aug 07 Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 Javascript
DropDownList控件绑定数据源的三种方法
Dec 24 Javascript
angular2中Http请求原理与用法详解
Jan 11 Javascript
原生js添加一个或多个类名的方法分析
Jul 30 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
利用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
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php解析url的三个示例
2014/01/20 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
解析vue中的$mount
2017/12/21 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
itchat接口使用示例
2017/10/23 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
python 监控logcat关键字功能
2020/09/04 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
学院书画协会部门岗位职责
2013/12/01 职场文书
补充协议书范本
2014/04/23 职场文书
企业指导教师评语
2014/04/28 职场文书
关于安全的演讲稿
2014/05/09 职场文书
党建目标管理责任书
2014/07/25 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
加入学生会自荐书
2015/03/05 职场文书
病危通知单
2015/04/17 职场文书
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis