Angular4总结(七)—— 与服务器通信

简介: 创建web服务器使用express搭建通过npm init -y 命令会创建一个含有默认配置的 package.json的文件为了让nodejs支持typescript 使用命令:npm i @types/node —save创建tsconfig.

创建web服务器

使用express搭建
  1. 通过npm init -y 命令会创建一个含有默认配置的 package.json的文件
  2. 为了让nodejs支持typescript 使用命令:npm i @types/node —save
  3. 创建tsconfig.json文件:

    {
        "compilerOptions": {
            "target": "es5",
            "module": "commonjs",
            "emitDecoratorMetadata": true,
            "experimentalDecorators": true,
            "outDir": "build",
            "lib": ["es6"]
    
        },
        "exclude": ["node_modules"]
    }
  4. 然后安装express相关插件 npm install express —save
  5. 同样需要让他支持typescript npm i @types/express —save
  6. 编译过后(我使用的是VS code, 通过run task,进行编译), 通过 node build/编译出来的文件。执行就行。执行命令为node build/auction_server.js
  7. 如果需要热部署可以安装nodemon 命令为 npm install nodemon -g

下面贴出服务器端代码的样例:

//引入Express包的相关引用
import * as express from 'express'

//引入WebSocket的包
import {Server} from 'ws'
import bodyParser = require('body-parser');

/**
 * 通过express对象,拿到具体属性
 */
const app = express();
//如果需要post请求,一定要加入这段代码,否则会request body会是undefined
app.use(bodyParser.json());

/**
 * 这个类作为一个 product的实体类,被用来承接从后台发过来的数据。
 */
// tslint:disable-next-line: class-name
export class productModel {
    constructor(
      public id: number,
      public title: string,
      public price: number,
      public rating: number,
      public desc: string,
      public categories: Array<string>
    ) {}
  }
  
  const products: productModel[] = [ 
    new productModel(1,"title1",1,1,"Description1,Description1,Description1,Description1",["图书","电子书"]),
    new productModel(2,"title2",2,2,"Description2,Description2,Description2,Description2",["手机","电子书"]),
    new productModel(3,"title2",2,3,"Description3,Description3,Description3,Description3",["pad","笔记本"]),
    new productModel(4,"title2",2,4,"Description4,Description4,Description4,Description4",["手机","笔记本"]),
    new productModel(5,"title2",2,5,"Description5,Description4,Description4,Description4",["笔记本","图书"]),
    new productModel(6,"title6",6,5,"Description6,Description6,Description6,Description6",["pad","手机"])
  ];


  // tslint:disable-next-line: class-name
export class commentModel {
  constructor(
    public id: number,
    public productId: number,
    public title: string,
    public rating: number,
    public desc: string
  ) {}
}

 const comments: Array<commentModel> = [
  // tslint:disable-next-line: no-use-before-declare
  new commentModel(1, 1, "title1", 1, "Comment1"),
  // tslint:disable-next-line: no-use-before-declare
  new commentModel(2, 1, "title2", 2, "Comment2"),
  // tslint:disable-next-line: no-use-before-declare
  new commentModel(3, 1, "title3", 3, "Comment3"),
];

/**
 * 定义一个get请求的API
 */
app.get('/', (request, response) => {
    response.send('Hello Express');
});

/**
 * 定义一个get请求的API,为了获取商品信息。
 */
app.get('/api/product', (request, response) => {
    response.json(products);
});

app.get('/api/product/:id', (request, response) => {
    response.json(products.find((product) => product.id == request.params.id));
});

app.get('/api/comments', (request, response) => {
  response.json(comments);
});

app.get('/api/comments/:productId', (request, response) => {
  response.json(comments.filter(comment => comment.productId == request.params.productId));
});

app.post('/api/products/condition', (req, res) => {
  console.log(req.body);
  res.json(products);
});

/**
 * 让服务器监听8000端口,并且开启服务。
 */
app.listen(8000, 'localhost', () => {
    console.log('node js 服务器已经启动!!');
});
通过express-generator搭建
  1. 通过命令安装 npm install express-generator —save -g
  2. 下载好后,直接express 项目名 即可。
  3. 然后通过命令 npm install 安装相应的包
  4. 如果想运行 通过命令 npm start。

Http通讯

要想使用angular的http请求,请按照如下几步操作来做:

  1. 在app.module.ts imports中添加上HttpClientModule模块

    import { HttpClientModule } from '@angular/common/http';
  1. 在需要使用的地方,引入Obserable,和HttpClient包

    import { Observable } from 'rxjs';
    import { HttpClient } from '@angular/common/http';
  2. 将HttpClient依赖注入进来,然后定义我们想要的请求:

    constructor(private http: HttpClient) {
        this.dataObservable = http.get('api/product');
       }
  3. 然后在想要发送请求的地方,直接订阅我们刚刚定义的那个请求:

    this.dataObservable.subscribe((response) => {
            console.log(response);
            this.products = response;
        });

️请求是在这里subscribe的时候,才会真正的发送出去。

下面给出完整的代码:

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';

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

  private dataObservable: Observable<any>;
  private products: Array<any>;

  constructor(private http: HttpClient) {
    this.dataObservable = http.get('api/product');
   }

  ngOnInit() {
    this.dataObservable.subscribe((response) => {
        console.log(response);
        this.products = response;
    });
  }

}

然后需要着重说一下的是,这样虽然说定义好了,但是请求还是发不出去的,因为我们要访问的不可能是在当面的这个项目中的,一定是开在了别的某台机器上的某个项目里。

那这应该怎么办呢?

我们需要定一个文件,告诉angular这些情况,我们定义一个proxy.config.json,文件内容如下:

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

这段代码的意思是告诉angular如果是api前缀的URL,我们应该去本地的8000端口中去寻找。

最后将package.json中的 scripts中的start指令改为如下的命令即可:

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

WebSocket通讯

webSocket协议

传统的Http协议,只能是在发送请求状态和接收响应状态相互交换。而webSocket可以在一个连接点进行交换数据。

webSocket是一个长连接。

webSocket协议相对于http协议携带的数据更少。

安装webSocket在nodejs中

通过命令:

npm install ws --save
npm install @types/ws --save
服务端websocket

websocket的服务器端和Http服务器的搭建特别类似:

  1. 引入WebSocket包

    //引入WebSocket的包
    import {Server} from 'ws'
  2. 监听WebSocket连接时间,然后作出对应的处理

    webSocket.on('connection', websocket => {
      //从服务器端推送一个消息返回给客户端
      websocket.send("客户端连接后,响应给客户端的消息");
      //接收从客户端端发来的消息
      websocket.on('message', message => console.log(message));
    });
  3. 有的时候我们也有服务器端在一段时间间隔内,不断向客户端推送的需要:

    **
     * 定时向客户端推送消息,间隔为三秒
     */
    setInterval(function(){
      if (webSocket.clients) {
        webSocket.clients.forEach(client => {
          client.send('定时发送消息');
        });
      }
    }, 3000);
客户端websocket

封装两个方法用于以后的使用:

首先定义一个变量 ws: WebSocket;

  1. 建立与服务器端的连接

    /**
    * 这个方法用于当我们发送一个连接的方法
    * @param url
    */
      createObserableWebSocket(url: string): Observable<any> {
     this.ws = new WebSocket(url);
     return new Observable(
    obserer => {
      //当有消息发送过来时候的一个监听。
      this.ws.onmessage = (event) => obserer.next(event.data);
      //当有错误的时候一个监听。
      this.ws.onerror = (event) => obserer.error(event);
      //当结束的时候一个监听。
      this.ws.onclose = (event) => obserer.complete();
     });
      }
  1. 向服务器端推送消息

      /**
    * 通过websocket发送消息
    */
      sendMessage(msg: string) {
     this.ws.send(msg);
      }

然后就可以通过使用这两个方法进行与websocket服务端的通信。

在需要建立websocket的地方写如下的代码,一般会写在ngOnInit方法中,也就是说在组件刚开始创建的时候,就会建立连接:

this.wsService.createObserableWebSocket('ws://localhost:8085')
    .subscribe(
      data => console.log(data),
      error => console.log(error),
      () => console.log('连接完成')
    );

如果需要发送消息,可以写如下代码:

this.wsService.sendMessage('从客户端发送的消息');
目录
相关文章
|
3月前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
104 1
|
3月前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
41 3
|
3月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
74 0
|
3月前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
74 0
|
27天前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
34 6
|
26天前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
1月前
|
运维 安全 网络安全
运维笔记:基于阿里云跨地域服务器通信
运维笔记:基于阿里云跨地域服务器通信
51 1
|
11天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
31 0
|
11天前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
25 0
|
11天前
|
前端开发 安全 开发者
JSF文件上传,让Web应用如虎添翼!一招实现文件上传,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,文件上传是重要功能之一。JSF(JavaServer Faces)框架提供了强大的文件上传支持,简化了开发流程。本文将介绍JSF文件上传的基本步骤:创建前端表单、处理上传文件的后端Action类、将文件保存到服务器指定目录以及返回结果页面。通过示例代码,我们将展示如何利用JSF实现文件上传功能,包括使用`h:inputFile`控件和`ManagedBean`处理上传逻辑。此外,JSF文件上传还具备类型安全、解耦合和灵活性等优点,有助于提升程序的健壮性和可维护性。
19 0