dart系列之:实时通讯,在浏览器中使用WebSockets

   2023-02-09 学习力0
核心提示:目录简介dart:html中的WebSockets创建一个WebSocketWebSocket的状态发送消息处理WebSocket事件总结简介web客户端和服务器端通信有两种方式,一种是使用HTTP请求,从服务器端请求数据。这种请求的缺点就是只能客户端拉取服务器端的数据,只能进行轮询。另外一

简介

web客户端和服务器端通信有两种方式,一种是使用HTTP请求,从服务器端请求数据。这种请求的缺点就是只能客户端拉取服务器端的数据,只能进行轮询。

另外一种方式是使用WebSocket,在客户端和服务器端之间建立通道,这样服务器就可以直接向客户端推送消息,避免了客户端频繁的拉取服务器端的数据,造成服务器端的压力。

dart:html包中就包含了WebSockets的相关操作,一起来看看吧。

dart:html中的WebSockets

WebSocket使用的是ws和wss作为URI的标记符。其中ws表示的是websocket,而wss表示的是WebSocket Secure。

WebSocket可以分为客户端和服务器端两部分。dart:html中提供的WebSocket对象中包含的是客户端的逻辑。

我们先看下WebSocket类的定义:

@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
@Unstable()
@Native("WebSocket")
class WebSocket extends EventTarget

可以看到它继承自EventTarget,并且支持chrome、firfox、IE10和Safari这几种浏览器。

创建一个WebSocket

WebSocket有两种创建方式,第一种是带protocal,一种是不带protocal:

  factory WebSocket(String url, [Object? protocols]) {
    if (protocols != null) {
      return WebSocket._create_1(url, protocols);
    }
    return WebSocket._create_2(url);
  }

这里的protocols指的是在webSocket协议框架之下的子协议,它表示的是消息的格式,比如使用soap或者wamp。

子协议是在WebSocket协议基础上发展出来的协议,主要用于具体的场景的处理,它是是在WebSocket协议之上,建立的更加严格的规范。

我们看一个最简单的创建WebSocket的代码:

 var webSocket = new WebSocket('ws://127.0.0.1:1337/ws');

以上如果服务器存在的话,就会成功建立一个WebSocket的连接。

WebSocket的状态

WebSocket有四个状态,分别是closed, closing, connecting和open,都是以static来定义的,可以直接引用:

  static const int CLOSED = 3;

  static const int CLOSING = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;

发送消息

dart中的WebSocket定义了5中发送消息的方法:

  void send(data) native;

  void sendBlob(Blob data) native;

  void sendByteBuffer(ByteBuffer data) native;

  void sendString(String data) native;

  void sendTypedData(TypedData data) native;

WebSocket支持发送[Blob], [ByteBuffer], [String] 或者 [TypedData] 这四种数据类型。

如果直接使用send(data),则会根据data的具体类型选择不同的发送方法。

所以我们可以这样来发送数据:

 if (webSocket != null && webSocket.readyState == WebSocket.OPEN) {
        webSocket.send(data);
      } else {
        print('webSocket连接异常!');
      }

处理WebSocket事件

dart中的WebSocket客户端可以处理WebSocket中的各种事件,webSocket中定义了4种事件,如下所示:

  Stream<CloseEvent> get onClose => closeEvent.forTarget(this);

  Stream<Event> get onError => errorEvent.forTarget(this);

  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);

  Stream<Event> get onOpen => openEvent.forTarget(this);

onOpen处理的是建立连接事件,onClose处理的是关闭连接事件,onMessage处理的是接收消息事件,onError处理的是异常处理事件。

举个消息处理的例子:

 webSocket.onMessage.listen((MessageEvent e) {
        receivedData(e.data);
      });
 

总结

WebSocket是一种非常方便和实时的客户端和服务器端的通信方式,大家可以多尝试使用。

本文已收录于 http://www.flydean.com/22-dart-websockets/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Dart空安全的底层原理与适配
    Dart空安全的底层原理与适配
    一、在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null。从类型理论的角度来说,Null 类型被看作是所有类型的子类;   类型会定义一些操作对象,包括 getters、setters、方法和操作符,在表达式中使用。如果是 List 类型,您可
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • oogle的“ JavaScript杀手” Dart 与JavaScript的比较
    oogle的“ JavaScript杀手” Dart 与JavaScript
    JavaScript通常被称为浏览器脚本语言,但它也已扩展到许多服务器端和移动应用程序开发环境。JS已经存在了将近20年,可以肯定地说它确实是一种成熟且稳定的编程语言。在Facebook发布React和React Native框架之后,JS变得越来越流行。JavaScript具有自己的软件
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    Flutter开发指南之理论篇:Dart语法05(单线程
    此文转载自:https://blog.csdn.net/AndrExpert/article/details/110823218Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate) Flutter开发指南之理论篇:Flutter基础01(架构,设计思想) Dart是一门面向对象语言,它针对web 和移
    03-08
  • flutter 填坑之旅(dart学习笔记篇)
    flutter 填坑之旅(dart学习笔记篇)
    俗话说 ‘工欲善其事必先利其器’ 想要撸flutter app 而不懂 dart 那就像一个不会英语的人在和英国人交流,懵!安装 dart 就不用说了,比较简单dart 官网 https://dart.dev/安装完成后就开启学习dart 旅程吧…一、 首先得找个ide (总不能使用记事本撸吧),所
    03-08
  • dart 命令行
       dart build 
    02-09
  • dart系列之:dart语言中的异常 dart新手的错误
    目录简介Exception和ErrorThrow和catchFinally总结简介Exception是程序中的异常情况,在JAVA中exception有checked Exception和unchecked Exception。那么在dart中的情况是不是一样的呢?一起来看看吧。Exception和ErrorDart中表示异常的类有两个,分别是Excep
    02-09
点击排行