在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插件 easyUI属性汇总
Jan 19 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
Jun 13 Javascript
Vue.js组件通信的几种姿势
Oct 23 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
Sep 27 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 Javascript
JavaScript中reduce()的5个基本用法示例
Jul 19 Javascript
在Vue中使用HOC模式的实现
Aug 23 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 Javascript
JavaScript原始值与包装对象的详细介绍
May 11 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
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python交换变量
2008/09/06 Python
python编程实现希尔排序
2017/04/13 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
创业者是否需要商业计划书?
2014/02/07 职场文书
IT工程师岗位职责
2014/07/04 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
培训讲师开场白
2015/06/01 职场文书
惊天动地观后感
2015/06/10 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS