在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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
JavaScript和ActionScript的交互实现代码
Aug 01 Javascript
jQuery学习笔记之jQuery的事件
Dec 22 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
Nov 26 Javascript
调用HttpHanlder的几种返回方式小结
Dec 20 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
Sep 07 Javascript
jQuery点击输入框显示验证码图片
May 19 Javascript
模拟javascript中的sort排序(简单实例)
Aug 17 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
vue 组件中添加样式不生效的解决方法
Jul 06 Javascript
vue 使用html2canvas将DOM转化为图片的方法
Sep 11 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
利用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 Ajax乱码
2008/04/09 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
js select option对象小结
2013/12/20 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python生成随机数组的方法小结
2017/04/15 Python
Python学习思维导图(必看篇)
2017/06/26 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python如何给你的程序做性能测试
2020/07/29 Python
Python如何telnet到网络设备
2021/02/18 Python
英国鞋网:Rubber Sole
2020/03/03 全球购物
工程管理专业毕业生自荐信
2014/01/24 职场文书
日语系毕业求职信
2014/07/27 职场文书
师范生见习报告
2014/10/31 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
庭外和解协议书
2016/03/23 职场文书
导游词之上海豫园
2019/10/24 职场文书