美文网首页
WeSocket通讯和从服务器将数据传输到客户端

WeSocket通讯和从服务器将数据传输到客户端

作者: 2764906e4d3d | 来源:发表于2019-02-05 21:02 被阅读0次

WeSocket通讯

  1. WeSocket协议:低负载二进制协议,允许在同一个连接中同时双方向的数据传递,在发送请求的同时还能接受数据,所以WeSocket协议通讯时延迟低,而且由于常连接的存在,不需要每次请求时都需要携带一些连接相关的信息
    http协议进行通讯时,客户端和服务器的连接在同一时间只能有一个发送请求和服务器响应不能同时进行
  2. 安装WeSocket依赖库和类型定义文件

npm i ws --save
npm i @types/ws --save-dev

  1. 在8085端口创建一个服务器,当有客户端连接到这个服务器时给这个客户端推送一个消息
import  {Server} from  'ws'

const wsServer =new Server({port:8085});
wsServer.on("connection",websocket=>{
    websocket.send("服务器主动推送消息");
    websocket.on("message",message=>{
        console.log("接收"+message);
    })
});

  1. 在需要连接的客户端中生成一个service
ng g service shared/webSocket
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);
  }

}


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");
  }

}
  1. 定时向所有客户端推送消息
setInterval(()=>{
    if(wsServer.clients){
        wsServer.clients.forEach(client=>{
            client.send("定时推送");
        })
    }
},2000);

从服务器将数据传输到客户端使用

  1. 将商品服务中的商品数组和评论数组放入到node服务器中,从服务器中获取数据,将方法中的商品数组,和评论数组使用一个流Observable来引用
getProducts(): Observable<Product[]> {
  return this.http.get("/api/products").map(res=>res.json());
}
getProduct(id:number): Observable<Product> {
  return this.http.get("/api/product"+id).map(res=>res.json());
}

getCommentsForProductId(id: number):Observable<Comment[]>  {
  return this.http.get("/api/product"+id+"/comments").map(res=>res.json());

}

  1. 在商品组件中同样执行相同的操作使用Observable,并且在模板中将管道过滤器改为使用异步管道async
<div class="col-md-4 col-sm-4 col-lg-4" *ngFor="let product of products | async">
  1. 在商品详情组件中将服务器获取的两个数组的流转化成数组以便使用
ngOnInit() {
  let productId:number = this.routeInfo.snapshot.params["productId"];
 this.productService.getProduct(productId).subscribe(
   product=>this.product=product
 );
  this.productService.getCommentsForProductId(productId).subscribe(
    comments=>this.comments=comments
  )
}
  1. 在界面中有属性不能读取,说明有数据属于undefined,因为现在的服务都是通过http,这就是一个异步服务,在组件中还没有获取到数据时就属于undefined需要将模板中的product和comment后加上?,但是for循环中的comment不需要更改,因为ngFor是会自动检测数据是否为空,这样就完成了数据从服务器到客户端的传输
<div class="thumbnail">
  <img  src="http://placehold.it/820x230" >
  <div>
    <h4 class="pull-right">{{product?.price}}元</h4>
    <h4>{{product?.title}}</h4>
    <p>{{product?.desc}}</p>
  </div>
  <div>
    <p class="pull-right">评论 {{comments?.length}} 条</p>
    <p>
      <app-start [rating]="product?.rating" ></app-start>
    </p>
  </div>
</div>

<div class="well">
<div>
  <button class="btn btn-success" (click)="isCommentHidden=!isCommentHidden">评论</button>
</div>

  <div [hidden]="isCommentHidden">
    <div><app-start [(rating)]="newRating" [readonly]="false"></app-start></div>
    <div>
      <textarea [(ngModel)]="newComment"></textarea>
    </div>
    <button class="btn" (click)="addComment()">发表</button>
  </div>

  <div class="row" *ngFor="let comment of comments">
    <hr>
    <div>
      <div class="col-md-12">
        <app-start [rating]="comment?.rating"></app-start>
        <span>用户名:{{comment.user}}</span>
        <span class="pull-right">{{comment.timestamp}}</span>
        <p></p>
        <p>
          {{comment.content}}
        </p>
      </div>
    </div>
  </div>
</div>

相关文章

  • WeSocket通讯和从服务器将数据传输到客户端

    WeSocket通讯 WeSocket协议:低负载二进制协议,允许在同一个连接中同时双方向的数据传递,在发送请求的...

  • 答辩常问问题文档

    如何实现前后台数据传输?使用http通信实现的了前后台数据传输,客户端发送http请求到服务器端,服务器端根据请求...

  • Thrift 简单demo之list

    需求:两个Java进程之间进行通讯,客户端和服务器端,客户端发送List 这个消息到另外一个服务器,另外一个服务器...

  • SVN相关知识

    1.0 从服务器端下载代码到客户端本地 将服务器中dongxi仓库的内容下载到/Users/mukang/Desk...

  • 数据传输方式(socket 、webservice 及 http

    1 数据传输方式 1.1 socket传输的定义和其特点 所谓socket通常也称作"套接字",实现服务器和客户端...

  • dh秘钥交换算法实践

    一、场景 出于对于服务器与客户端数据传输安全的需要,将整个请求的入参出参按照约定方式加密,这里选用 AES ,入选...

  • 从0基础的I/O到Netty的入门(1)

    背景 这里的I/O主要指网络编程,即客户端和服务器之间的通讯。任何高并发高性能的网络通讯都是从单一的客户端服务端应...

  • 1、web端即时通讯开发总结

    web端即时通讯开发总结 浏览器原理: 客户端请求服务器->服务器返回结果 结论:web 通讯必须通过 服务器进行...

  • 【golang】实现基于UDP协议的简单的C-S架构

    与TCP相比,UDP的服务器和客户端之间不用建立持久的连接,数据传输更加高效,但稳定性和安全性较差 一、服务器 二...

  • 理解 TCP(四):状态流转

    更好阅读体验:《理解 TCP 和 UDP》— By Gitbook 无论客户端还是服务器,在双方 TCP 通讯的过...

网友评论

      本文标题:WeSocket通讯和从服务器将数据传输到客户端

      本文链接:https://www.haomeiwen.com/subject/nfnvsqtx.html