在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 相关文章推荐
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
Apr 08 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
Nov 14 Javascript
Bootstrap实现登录校验表单(带验证码)
Jun 23 Javascript
重新认识vue之事件阻止冒泡的实现
Aug 02 Javascript
如何实现双向绑定mvvm的原理实现
May 28 Javascript
一文看懂如何简单实现节流函数和防抖函数
Sep 05 Javascript
开发Node CLI构建微信小程序脚手架的示例
Mar 27 Javascript
使用jQuery实现购物车
Oct 29 jQuery
原生JS运动实现轮播图
Jan 02 Javascript
ant design charts 获取后端接口数据展示
May 25 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与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
php使用codebase生成随机数
2014/03/25 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
php中stdClass的用法分析
2015/02/27 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
vue中appear的用法
2017/08/17 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
异常和异常类的概念
2014/09/12 面试题
公司合作协议书范本
2014/04/18 职场文书
物资采购管理制度
2015/08/06 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle