在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动画3.创建一个带遮罩效果的图片走廊
Aug 24 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
Jan 02 Javascript
在JavaScript中使用对数Math.log()方法的教程
Jun 15 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
Nov 27 Javascript
Angular 路由route实例代码
Jul 12 Javascript
Javascript中常见的逻辑题和解决方法
Sep 17 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
Jan 12 Javascript
JavaScript fetch接口案例解析
Aug 30 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
Jul 21 Javascript
原生js实现表格翻页和跳转
Sep 29 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与已存在的Java应用程序集成
2006/10/09 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
浅析php数据类型转换
2014/01/09 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
Python获取邮件地址的方法
2015/07/10 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
4s客服专员岗位职责
2013/12/01 职场文书
商场消防演习方案
2014/02/12 职场文书
求职自荐信怎么写
2014/03/06 职场文书
工作散漫检讨书
2014/09/16 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
python 实现的截屏工具
2021/05/08 Python