返回顶部
首页 > 资讯 > 精选 >Flutter学习笔记 —— WebSocket篇
  • 123
分享到

Flutter学习笔记 —— WebSocket篇

flutter学习websocket 2023-08-22 09:08:43 123人浏览 薄情痞子
摘要

Flutter学习笔记 —— websocket篇 前言 WEBSocket 大家都不陌生了,我们今天来看看怎么在Flutter中使用WebSocket! 开发环境 Android StudioAndroid SD

在这里插入图片描述

前言

WEBSocket 大家都不陌生了,我们今天来看看怎么在Flutter中使用WebSocket!

开发环境

Flutter 安装插件

web_socket_channel: ^2.2.0

正文

我们使用 WebSocket库来进行WebSocket的相关操作

一、连接

使用该库的连接方法为以下方式

IOWebSocketChannel ioWebSocketChannel = IOWebSocketChannel.connect("ws://ip:端口/ws");

连接成功后,我们下一步就是进行监听Socket消息

ListenerStream(监听Socket消息)

以下是监听Socket消息方式

ioWebSocketChannel.stream.listen((data){    //消息}));

值得一提的是监听方式不但可以监听消息,还可以监听异常和Socket连接是否结束

以下是代码示例

ioWebSocketChannel.stream.listen((event) {                 },onDone: (){         //结束!       },onError: (){         //异常!    });

我们知道,当Socket服务一定时间内没收到消息则会认为超时,那么我们应该发送心跳包,接下来会逐步介绍

SendMessage(发送Socket消息)

发送Socket消息也非常简单,请看代码示例

ioWebSocketChannel.sink.add("消息");

add(T) 可以发送的消息是一个泛型,意味着你可以发送不同的消息至服务器

四、发送心跳包

什么是心跳包呢?简述概括就是:

当Socket服务一定时间没有收到消息则会自动断连,那么此时我们要做的就是一定时间内发送心跳消息至Socket服务,让服务认为客户端还活着,从而继续工作!

我们从中可以得到一些关键字的消息

一定时间发送消息至服务器

第一时间我们想到的就是定时器(Timer) 当然如果你想用Future的延迟也是可以的!

说了那么多,我们看看如何实现!

定义计时器方法

    static void sendHeartPacket(){    Map<String,dynamic> data = {      "code": 9999,      "msg": "心跳包",    };    var JSONData = json.encode(data);    IOWebSocketChannel.sink.add(jsonData);  }

我们定义了一个基础的发包方法,那我们接下来需要处理的就是,在一定时间内发心跳包到服务器,如果心跳包发成功了,那么我们应该重新连接

发送心跳包

    static void heartPacket(){      //自定义Bool,判断是否Socket开启状态     if(state.socketStatus){      //自定义重连时间间隔       hearTimer = Timer(Duration(seconds: state.socketClienTime),() async{       //  重新连接         reconnectSocket();       });       sendHeartPacket();     }  }

断开连接

    static void destoryHeart(){     //为心跳包则直接     if(state.heartStatus){        hearTimer?.cancel();        state.heartStatus = false;     }  }

重新连接

    static void reconnectSocket(){     destoryHeart();     connectSocket();  }

代码示例

import 'dart:async';import 'package:dio/dio.dart';import 'package:web_socket_channel/io.dart';import 'package:web_socket_channel/web_socket_channel.dart';import 'State.dart';import 'dart:convert';import 'Result.dart';class WebSocketHandle {  static WebSocketState state = WebSocketState();  static late Timer hearTimer;  WebSocketHandle();   static void connectSocket() async {       await closeSocket();       String socketUrl = state.socketUrl;       LoggerUtil.logger.i("发起WebSocket请求,地址为:${socketUrl}");       state.webSocket = IOWebSocketChannel.connect(socketUrl);       state.socketStatus = true;       initConnectSocket();  }  static void initConnectSocket(){    WebSocketHandle.onMessageListener();    heartPacket();  }    static bool validConnection(String ip,int port){     return state.ip == ip && state.port == port ? true : false;  }    static void onMessageListener(){     WebSocketResult webSocketResult = WebSocketResult();     state.webSocket?.stream.listen((data){      var jsonData = json.decode(data);      if(jsonData is Map<String,dynamic>){        //检测到心跳包        if(jsonData['code'] == 9999){        //  不处理        }else{          Map<String,dynamic> mapData = jsonData['data'];          webSocketResult = WebSocketResult.fromJson(mapData);            state.webSocketResult = webSocketResult;            LoggerUtil.logger.i("监听到服务端Socket返回数据:                   ${state.webSocketResult.toString()}");   },onError: (e){      state.socketStatus = false;      state.isError = true;    },onDone: (){      state.socketStatus = false;    });  }    static void destoryHeart(){     //为心跳包则直接     if(state.heartStatus){        hearTimer?.cancel();        state.heartStatus = false;     }  }    static void sendHeartPacket(){    Map<String,dynamic> data = {      "code": 9999,      "msg": "心跳包",    };    var jsonData = json.encode(data);    state.webSocket?.sink.add(jsonData);    state.heartStatus = true;  }    static void heartPacket(){     if(state.socketStatus){       hearTimer = Timer(Duration(seconds: state.socketClienTime),() async{       //  重新连接         reconnectSocket();       });       sendHeartPacket();     }  }    static void reconnectSocket(){     destoryHeart();     connectSocket();  }    static Future closeSocket() async{     if(state.webSocket != null){       state.webSocket?.sink.close();       state.webSocket = null;       state.socketStatus = false;     }  }}

结束

至此笔记到此结束,感谢你的观看!

来源地址:https://blog.csdn.net/qq_33638188/article/details/127106389

--结束END--

本文标题: Flutter学习笔记 —— WebSocket篇

本文链接: https://lsjlt.com/news/377692.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flutter学习笔记 —— WebSocket篇
    Flutter学习笔记 —— WebSocket篇 前言 WebSocket 大家都不陌生了,我们今天来看看怎么在Flutter中使用WebSocket! 开发环境 Android StudioAndroid SD...
    99+
    2023-08-22
    flutter 学习 websocket
  • Java学习笔记之Maven篇
    目录一、maven能做什么?1.1 两大应用1.2 maven 的核心二、maven结构:2.1 maven工程标准目录结构2.2 配置系统变量2.3 常用命令三、应用:idea集成...
    99+
    2024-04-02
  • Flutter学习笔记(三)RowColum布局
    目录主题开发环境源码开发过程主题 本文将介绍,flutter中的row,colum的用法。通俗来说,就是横向布局和纵向布局的用法。 开发环境 win10androidstudio20...
    99+
    2023-05-14
    Flutter学习 Flutter Row Flutter Colum Flutter布局
  • Nodejs学习笔记之入门篇
    分享第一篇,关于 NodeJS —— Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript ...
    99+
    2022-06-04
    学习笔记 入门篇 Nodejs
  • Python学习笔记(办公篇Excel)
    简介:      今日接了个小单,把数据从xlsx读取到本地生成散点图,在读取日期数据时发现,读取下来的日期是数字,不是日期的格式    所要用的库: xlrd :1.1.0 time: datetime: 解决方法: ...
    99+
    2023-01-30
    学习笔记 Python Excel
  • Flutter学习笔记(一)配置环境
    目录背景主题当前环境配置过程下载flutter sdk配置flutter sdk环境背景 在日益内卷的开发圈子,多一项技能就意味着竞争力的提升,受到大环境的各种因素,所以有了这篇文章...
    99+
    2023-05-14
    Flutter学习 Flutter配置环境
  • Flutter学习笔记(二)创建一个flutter项目
    目录开发环境实践运行网络环境配置(1)进入packages\flutter_tools\gradle 文件夹,然后打开flutter.gradle文件。目录如下图所示:(2)进入 f...
    99+
    2023-05-14
    Flutter学习 Flutter创建 创建flutter项目
  • python学习笔记(三)—数据库篇
    一、数据库编程 数据库编程是指在应用程序中使用数据库管理系统(DBMS)进行数据存储、检索和处理的过程。数据库提供了一种结构化的方式来组织和存储数据,使得数据的管理更加高效和可靠。 1.1 关系数据库...
    99+
    2023-09-18
    python 学习 笔记
  • python学习笔记-利器篇1:IPyt
     子曰:工欲善其事必先利其器 偶然在一篇谈pyhon的文章中看到了IPython。第一感觉就是这和苹果有啥关系吧,兴起一搜才发现原来是一个代替python默认命令行终端的玩样儿。 它家网站上贴出来的宣传图真是好看阿,又是彩色高亮又是直接在终...
    99+
    2023-01-31
    利器 学习笔记 python
  • MySQL学习笔记——基础与进阶篇
        目录   一、###MySQL登录和退出     二、###MySQL常用命令     三、###MySQL语法规范     四、###基础查询     五、###条件查询     六、###排序查询     七、###常...
    99+
    2017-06-14
    MySQL学习笔记——基础与进阶篇
  • TypeScript学习笔记之类型窄化篇
    目录前言类型推论真值窄化相等性窄化in操作符窄化instanceof窄化窄化的本质联合类型的窄化总结前言 TS最好用的地方就是强类型,随之而来的就是类型窄化,摸鱼的时候顺道总结下. ...
    99+
    2024-04-02
  • 学习笔记-TP5框架学习笔记\(路由\)
    TP5框架简单理解 (PS:只做粗略、关键知识的记录,TP程序的开始。详情请阅读官方手册) 1. 架构总览 TP程序的开始 PHP >=5.3.0, PHP7 ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方...
    99+
    2023-10-25
    学习 php 开发语言
  • sqlite3 学习笔记
    #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @descrip : operate SqLite intrface # @Time : 2020/04/22 21:57 # @Au...
    99+
    2017-12-28
    sqlite3 学习笔记 数据库入门 数据库基础教程
  • 20200618_MySQL学习笔记
    加号 + Mysql中加号只能做运算符 select 100+90  ==> 190  select "100"+90 ==> 190  如果有一个是字符串,那么尝试转换成数值型,转换成功 select "ja...
    99+
    2014-11-26
    20200618_MySQL学习笔记
  • 20200619 学习笔记
    主键和唯一的区别 主键:唯一、不为空、只能有一个、可以组合但不推荐 唯一:唯一、可为空、可以多个、可以组合但不推荐 外键 要求在从表设置外键关系 从表的外键列的类型和主表的关联列的类型要求一致或兼容 主...
    99+
    2019-12-15
    20200619 学习笔记
  • 20200617学习笔记
    基数  一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好 我们可以使用 show index 方法,看到一个索引的基数 MySQL 是怎样得到索引的基数的呢? 采样...
    99+
    2022-02-22
    20200617学习笔记
  • 20200616学习笔记
    count(*) 的实现方式 在不同的 MySQL 引擎中,count(*) 有不同的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高 而 InnoDB ...
    99+
    2018-10-19
    20200616学习笔记
  • Mycat 学习笔记
    概述 1. Mycat 是什么? Mycat 是数据库中间件,连接 Java 应用程序和数据库,它的作用如下: 读写分离 数据分片:垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表) 多数据源整合 2....
    99+
    2019-10-05
    Mycat 学习笔记
  • postgres学习笔记
    将一个标识符变得受限同时也使它变成大小写敏感的,反之非受限名称总是被转换成小写形 式。例如,标识符FOO、foo和"foo"在PostgreSQL中被认为是相同的,而"Foo"和"FOO"则互 不相同且也不同于前面三个标识符(Postgr...
    99+
    2018-01-09
    postgres学习笔记
  • MySQL学习笔记
    作者: Grey 原文地址:MySQL学习笔记 说明 注:本文中的SQL语句如果用到了特定方言,都是基于MySQL数据库。 关于DDL DDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了...
    99+
    2015-01-17
    MySQL学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作