在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 相关文章推荐
ff下JQuery无法监听input的keyup事件的解决方法
Dec 12 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 Javascript
jquery实现ajax加载超时提示的方法
Jul 23 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 Javascript
node.js操作mysql简单实例
May 25 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
详解webpack自定义loader初探
Aug 29 Javascript
微信小程序自定义导航栏
Dec 31 Javascript
vue的滚动条插件实现代码
Sep 07 Javascript
浅谈Vue 函数式组件的使用技巧
Jun 16 Javascript
JavaScript中while循环的基础使用教程
Aug 11 Javascript
8个JS的reduce使用实例和reduce操作方式
Oct 05 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访问查询mysql数据的三种方法
2006/10/09 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
Python装饰器的函数式编程详解
2015/02/27 Python
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python实现视频分帧效果
2019/05/31 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
详解HTML5中的manifest缓存使用
2015/09/09 HTML / CSS
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
银行求职信
2014/05/31 职场文书
空气的环保标语
2014/06/12 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
委托证明范本
2014/11/25 职场文书
鸡毛信观后感
2015/06/11 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏