Angular_与服务器通讯(Websocket通讯)

2023-11-01

这里写图片描述

在上一篇文章中,我们创建了server服务,在那个项目中我们继续添加websocket服务

npm install ws –save

然后安装types格式的

npm install @types/ws –save-dev

实现场景

这里写图片描述

编写服务端
auction_server.js

"use strict";
var express = require("express");
var ws_1 = require('ws');
var app = express();
var Product = (function () {
    function Product(id, title, price, rating, desc, categories) {
        this.id = id;
        this.title = title;
        this.price = price;
        this.rating = rating;
        this.desc = desc;
        this.categories = categories;
    }
    return Product;
}());
exports.Product = Product;
var products = [
    new Product(1, '第一个商品', 1.99, 3.5, "这是第一商品,asdxc奥术大师多撒", ["电子产品", "硬件设备", "其他"]),
    new Product(2, '第二个商品', 2.99, 2.5, "这是第二商品,奥术大师多驱蚊器二无", ["硬件设备", "其他"]),
    new Product(3, '第三个商品', 3.99, 1.5, "这是第三商品,请问驱蚊器翁群翁", ["电子产品", "硬件设备"]),
    new Product(4, '第四个商品', 4.99, 2.0, "这是第四商品,切勿驱蚊器翁", ["电子产品", "其他"]),
    new Product(5, '第五个商品', 5.99, 3.5, "这是第五商品,213123123", ["电子产品", "硬件设备", "其他"]),
    new Product(6, '第六个商品', 6.99, 4.5, "这是第六商品,啊多少大所多多", ["电子产品", "硬件设备", "其他"])
];
app.get('/', function (req, res) {
    res.send("Hello Express");
});
app.get('/products', function (req, res) {
    res.json(products);
});
app.get('/products/:id', function (req, res) {
    res.json(products.find(function (product) { return product.id == req.params.id; }));
});
var server = app.listen(8000, "localhost", function () {
    console.log("服务器已启动,地址是:http://localhost:8000");
});
var wsServer = new ws_1.Server({ port: 8085 });
wsServer.on("connection", function (websocket) {
    websocket.send("这个消息是服务器主动推送的");
    websocket.on("message", function (message) {
        console.log("接收到消息:" + message);
    });
});

然后编写客户端,注意是客户端,跟服务端不是一个项目!!

ng g service shared/webSocket

web-socket.service.ts

import {Injectable} from '@angular/core';
import {Observable} from "rxjs";

@Injectable({
    providedIn: 'root'
})
export class WebSocketService {

    ws: WebSocket;

    constructor() {
    }

    createObservableSocket(url: string): Observable<any> {
        this.ws = new WebSocket(url);
        return new Observable(
          observer =>{
              //什么时候发生下一个元素
              this.ws.onmessage = (event) => observer.next(event.data);
              //什么时候抛一个异常
              this.ws.onerror = (event) => observer.error(event);
              //什么时候发出流结束的信号
              this.ws.onclose = (event) => observer.complete();

          }
        );
    }

    sendMessage(message:string){
        this.ws.send(message);
    }
}

写完客户端服务,开始写组件

ng g component webSocket

在app.module.ts声明服务的提供器

 providers: [WebSocketService],

web-socket.component.ts

import { Component, OnInit } from '@angular/core';
import {WebSocketService} from "../shared/web-socket.service";

@Component({
  selector: 'app-web-socket',
  templateUrl: './web-socket.component.html',
  styleUrls: ['./web-socket.component.css']
})
export class WebSocketComponent implements OnInit {

  constructor(private wsService:WebSocketService) { }

  ngOnInit() {
    this.wsService.createObservableSocket("ws://localhost:8085")
        .subscribe(
            data => console.log(data),
            err => console.log(err),
            () => console.log("流已经结束")
        )
  }

  sendMessageToserver(){
      this.wsService.sendMessage("Hello from client");
  }

}

web-socket.component.html

<button (click)="sendMessageToserver()">点击发送webSocket消息</button>

让应用调用webSocket组件
app.component.html

<app-web-socket></app-web-socket>

这里写图片描述
这里写图片描述

新建配置文件proxy.conf.json

{
  "/api":{
    "target":"http://localhost:8000"
  }
}

修改package.json

"start": "ng serve --proxy-config proxy.conf.json",

修改服务端server项目

auction_server.js

"use strict";
var express = require("express");
var ws_1 = require('ws');
var app = express();
var Product = (function () {
    function Product(id, title, price, rating, desc, categories) {
        this.id = id;
        this.title = title;
        this.price = price;
        this.rating = rating;
        this.desc = desc;
        this.categories = categories;
    }
    return Product;
}());
exports.Product = Product;
var products = [
    new Product(1, '第一个商品', 1.99, 3.5, "这是第一商品,asdxc奥术大师多撒", ["电子产品", "硬件设备", "其他"]),
    new Product(2, '第二个商品', 2.99, 2.5, "这是第二商品,奥术大师多驱蚊器二无", ["硬件设备", "其他"]),
    new Product(3, '第三个商品', 3.99, 1.5, "这是第三商品,请问驱蚊器翁群翁", ["电子产品", "硬件设备"]),
    new Product(4, '第四个商品', 4.99, 2.0, "这是第四商品,切勿驱蚊器翁", ["电子产品", "其他"]),
    new Product(5, '第五个商品', 5.99, 3.5, "这是第五商品,213123123", ["电子产品", "硬件设备", "其他"]),
    new Product(6, '第六个商品', 6.99, 4.5, "这是第六商品,啊多少大所多多", ["电子产品", "硬件设备", "其他"])
];
app.get('/', function (req, res) {
    res.send("Hello Express");
});
app.get('/api/products', function (req, res) {
    res.json(products);
});
app.get('/api/products/:id', function (req, res) {
    res.json(products.find(function (product) { return product.id == req.params.id; }));
});
var server = app.listen(8000, "localhost", function () {
    console.log("服务器已启动,地址是:http://localhost:8000");
});
var wsServer = new ws_1.Server({ port: 8085 });
wsServer.on("connection", function (websocket) {
    websocket.send("这个消息是服务器主动推送的");
    websocket.on("message", function (message) {
        console.log("接收到消息:" + message);
    });
});
//定时给所有客户端推送消息
setInterval(function () {
    if (wsServer.clients) {
        wsServer.clients.forEach(function (client) {
            client.send("这是定时推送");
        });
    }
}, 2000);

这里写图片描述

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular_与服务器通讯(Websocket通讯) 的相关文章

  • 错误 TypeError:无法使用角度 6 读取 ngx-bootstrap 中 null 的属性“createText”

    我想使用以下命令从不同的组件打开 ngx bootstrap 模式 ViewChild在角度 6 但我收到此错误 错误类型错误 无法读取 null 的属性 createText 在 ComponentLoader push node mod
  • Angular 6 更新 - 未找到 rxjs-5-to-6-migrate 命令

    在升级过程中从更新 angular io https update angular io 使用 rxjs tslint 自动更新规则删除已弃用的 RxJS 6 功能 对于大多数应用程序 这意味着运行以下两个命令 npm install g
  • 如何将现有的 NativeScript Angular 项目转换为代码共享项目

    所有可用的教程都讨论将 Angular Web Apps 转换为代码共享 Nativescript 项目 我想做相反的事情 我几乎用 Nativescript 完成了移动应用程序的编码 现在我想制作一个在两者之间共享代码的 Web 应用程序
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • crypto.randomBytes 不是 Angular 中的函数

    我正在进口ethereumjs 钱包 https github com ethereumjs ethereumjs wallet在角度4中 import EthereumWallet from ethereumjs wallet var w
  • 调整移动加速计数据以考虑手机旋转

    我希望记录移动加速度计数据 x y z 并将其调整为一致 无论手机的方向 旋转如何 这里的用例是在驾驶时记录和标准化这些参数 以检测转弯 扭曲等 其中的一个关键要素是确保报告的数据独立于手机在汽车中的方向 我在用gyronorm js ht
  • Angular4 会话处理

    我有一个 sailsjs API 后端 我想使用 Angular4 作为我的前端 我想知道如何处理 Angular 上的会话 我尝试阅读文档但无法想出任何东西 具体来说 我需要能够处理登录 注销 CSRF 保护等 是否可以在 Sails 中
  • Angular 2 反应形式的嵌套数组?

    我使用以下教程在 Angular 2 中创建反应式表单 效果很好 https scotch io tutorials how to build nested model driven forms in angular 2 https sco
  • 如何使用 Angular2 或更高版本下载文件

    我有一个 WebApi MVC 应用程序 我正在为其开发一个 angular2 客户端 以替换 MVC 我在理解 Angular 如何保存文件时遇到一些困难 请求没问题 与 MVC 一起工作正常 我们可以记录收到的数据 但我不知道如何保存下
  • 使用 ngx-translate 翻译 Angular 2?

    我已按照说明进行所有配置和设置 应用程序模块 ts import Http from angular http import TranslateModule TranslateStaticLoader TranslateLoader Tra
  • 如何让元素在进入页面时滚动到滚动条的中心

    我正在制作一个 Angular 项目 它有一个 时间轴 组件 其中有一个overflow x scroll元素 container width 30vw height 100vh background color aquamarine ma
  • 反应式表单中使用的自定义组件 MdDatePicker

    我正在尝试创建一个要在角度 formGroup 中使用的自定义组件 以下是我想要使用此自定义组件的方式
  • 如何将 C3 图表添加到 Angular 2+ 项目

    我搜索了很多有关 Angular2 图表包的信息 但没有 C3 js 的名称 直到我在下面的链接中找到了 C3 js 图表的示例 ani angular strapui com dashboard charts c3 chart http
  • Angular2 路由器和一条路由中的多个解析

    In ui router在路由配置中定义多个解析很容易 所以我们可以这样说 export const APP STATES Ng2StateDeclaration name dashboard url dashboard component
  • 在 httpInterceptor 中过滤请求 - Angular 4.3+

    我有一个身份验证拦截器 但是 我希望此拦截器能够过滤请求 并且当用户访问不需要用户身份验证的组件 例如确认帐户密码等 时不应用该拦截器 有关于如何进行的示例吗 这是 auth 拦截器的逻辑 intercept request HttpReq
  • 不允许我将对象推入数组

    我正在使用 Angular 我试图将一个对象推入数组 但它给了我错误 它说类型错误 无法读取未定义的属性 push 也就是下面的代码 文章是一个对象 articles Article addArticle newTitle HTMLInpu
  • Angular4如何使用flatMap链接forkJoin

    我所处的情况是 我需要进行 5 个可以并行执行的 http 调用 在这五个调用之后需要执行另一个 http 调用 我在前 5 个中使用了 forkJoin 但我不知道如何链接 flatMap 或其他函数 forkJoin firstObse
  • 在 mat-table 父级中使用 ngif 时,mat-filtering/mat-sort 无法正常工作

    请注意 分页 排序无法正常工作 分页不显示它所显示的元素数量 并且排序不起作用 但是如果删除 html 文件中的行 ngIf dataSource filteredData length gt 0 错误已修复 如果使用过滤 它可以工作 但不
  • 执行 POST 请求时 Spring Boot 端点 403 OPTIONS

    我正在使用 Spring 运行一个服务 当我的 Angular 前端尝试发出 POST 请求时 会收到带有请求方法 选项的 403 错误 Spring 服务和 Angular 应用程序都在我的机器上本地运行 我尝试使用 Chrome 插件切
  • 如何访问父组件上定义的 ViewChild 引用 - Angular 2

    我在应用程序模板 根组件的模板 中定义了一个微调器 加载器元素 例如 div div 在我的子组件中 我尝试使用访问它 ViewChild但这似乎总是返回未定义 我在子组件中访问它的代码是 ViewChild spinner read Vi

随机推荐

  • 获取某值的具体某位

    获取某值的具体某位 函数 unsigned char get bit unsigned char temp int bit 获取某值的具体某位 参数 temp为传入的值 bit是要获取temp的值具体某一位的值 返回值 函数返回 传入参数t
  • xuperchain源码分析-智能合约

    XuperBridge XuperBridge为所有合约提供统一的合约接口 从抽象方式上类似于linux内核对应于应用程序 内核代码是一份 应用程序可以用各种语言实现 比如go c 类比到合约上就是各种合约的功能 如KV访问 QueryBl
  • SQLMAP的使用详情

    SQLMAP的使用详情 这里对dvwa 进行测试 1 安装sqlmap 由于sqlmap不支持python3 所以在安装之前需要安装Python2 这里使用的是python2 7 14 在官网下载安装包一键安装 安装完成以后紧接着安装sql
  • Adaboost算法和MATLAB实现

    一 AdaBoost简介 Boosting 也称为增强学习或提升法 是一种重要的集成学习技术 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器 这在直接构造强学习器非常困难的情况下 为学习算法的设计提供了一种有效的新思路和
  • IT职场难以“老有所终” 谁之过

    还有谁可能在一家企业 从一而终 吗 有资料显示 以往各大公司的裁员 辞退员工行为中 老员工都是更大的受害者 只是 现在华为的 万人辞职 行动公开 直接地把 矛头 指向了老员工 再次触及到了IT职场上老员工的去从难题 一位在华为工作11年的老
  • 英语词汇表

    A a an art 一 个 件 abandon v 放弃 抛弃 ability n 能力 才能 able a 能够 有能力的 abnormal a 不正常的 aboard prep 在 或上 船 飞机 火车等 abolish v 废除 a
  • 自连接表 ——《二级关注者》LeetCode Plus 会员专享题【详细解析】Hive / MySQL

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 另外也欢迎大家关注我的SQL刷题专栏 里面有我分享的高质量
  • windows环境python2.7安装pyinstaller

    作者环境 windows10 python2 7 直接使用pip install pyinstaller安装会报错 一开始是报pip版本过低 按照提示命令升级pip版本后又提示以下错误 到这里请跳到下面第5点尝试操作 如果不行 再回到这里阅
  • 正确实现 IDisposable 接口

    正确实现 IDisposable NET中用于释放对象资源的接口是IDisposable 但是这个接口的实现还是比较有讲究的 此外还有Finalize和Close两个函数 MSDN建议按照下面的模式实现IDisposable接口 NET的对
  • MapReduce(一):FileInputFormat源码解析

    来源 https www bilibili com video av36033875 from search seid 12700632591522714293 FileInputFormat切片机制 1 job提交流程源码详解 主要代码流
  • 虚拟内存有什么用

    虚拟内存是什么 虚拟内存别称虚拟存储器 Virtual Memory 电脑中所运行的程序均需经由内存执行 若执行的程序占用内存很大或很多 则会导致内存消耗殆尽 为解决该问题 Windows中运用了虚拟内存技术 即匀出一部分硬盘空间来充当内存
  • 【threejs效果:模型炸开】以钢铁侠obj模型为例

    1 效果如下 2 基本原理 首先加载一个obj模型 然后遍历obj模型的所有children mesh 按一定比例改变每个子mesh的中心点位置即可 爆炸代码 function modelExplode num 模型世界中心 var mod
  • 游戏资源贴

    转载自 http www gamedev net community forums topic asp topic id 324643 Ok so the point of this thread is simple to list as
  • Linux 6.6 中的 SELinux 删除了 NSA 的引用

    导读 Security Enhanced Linux SELinux 二十年来一直是主线内核的一部分 它提供了一个实现访问控制安全策略的模块 现在广泛用于增强生产 Linux 服务器和其他系统的安全性 长期接触 Linux 的人可能不知道
  • Java应用程序安全框架

    从零打造项目 系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实
  • openGL之API学习(八十四)glGetObjectLabel

    获取命名空间对象的标签 打标签由函数glObjectLabel执行 void glGetObjectLabel GLenum identifier GLuint name GLsizei bufSize GLsizei length cha
  • HTTP反爬困境

    尊敬的程序员朋友们 大家好 今天我要和您分享一篇关于解决反爬困境的文章 在网络爬虫的时代 许多网站采取了反爬措施来保护自己的数据资源 然而 作为程序员 我们有着聪明才智和技术能力 可以应对这些困境并确保数据的安全性 本文将重点介绍如何通过H
  • 如何把简单的事情一次做对?

    在工作中领导最讨厌的人就是总把简单的事情做错的下属 在绝大多数人不会犯错的地方犯错 在领导眼中会判定为是基本素质问题 是不可原谅的 如果组织要裁员 那优先裁掉的就是哪些总是犯低级错误的人 那如何确保能够把简单的事情一次做对 提升自己的职场竞
  • 好用用的linux 监控命令

    1 dstat 命令 参考http www cnblogs com vincent hv p 3358194 html dstat的基本使用 2 1 dstat的默认选项 与许多命令一样 dstat命令有默认选项 执行dstat命令不加任何
  • Angular_与服务器通讯(Websocket通讯)

    在上一篇文章中 我们创建了server服务 在那个项目中我们继续添加websocket服务 npm install ws save 然后安装types格式的 npm install types ws save dev 实现场景 编写服务端