当前位置: 首页 > news >正文

成都网站关键词排名经典广告推广词

成都网站关键词排名,经典广告推广词,html购物网站源码,如何做盗版网站前言Permalink Flutter简介 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 F…

前言Permalink
Flutter简介

Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Native引擎渲染视图,这无疑能为用户提供良好的体验。

WebSocket简介

Http协议是无状态的,只能由客户端主动发起,服务端再被动响应,服务端无法向客户端主动推送内容,并且一旦服务器响应结束,链接就会断开(见注解部分),所以无法进行实时通信。WebSocket协议正是为解决客户端与服务端实时通信而产生的技术,现在已经被主流浏览器支持,所以对于Web开发者来说应该比较熟悉了,Flutter也提供了专门的包来支持WebSocket协议。

注意:Http协议中虽然可以通过keep-alive机制使服务器在响应结束后链接会保持一段时间,但最终还是会断开,keep-alive机制主要是用于避免在同一台服务器请求多个资源时频繁创建链接,它本质上是支持链接复用的技术,而并非用于实时通信,读者需要知道这两者的区别。

WebSocket协议本质上是一个基于tcp的协议,它是先通过HTTP协议发起一条特殊的http请求进行握手后,如果服务端支持WebSocket协议,则会进行协议升级。WebSocket会使用http协议握手后创建的tcp链接,和http协议不同的是,WebSocket的tcp链接是个长链接(不会断开),所以服务端与客户端就可以通过此TCP连接进行实时通信。有关WebSocket协议细节,读者可以看RFC文档,下面我们重点看看Flutter中如何使用WebSocket。

话不多说,直接撸代码Permalink
添加依赖:

web_socket_channel: ^1.1.0 # WebSocket
新建web_socket_utility.dart工具类:

import 'dart:async';import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';/// WebSocket地址
const String _SOCKET_URL = 'ws://121.40.165.18:8800';/// WebSocket状态
enum SocketStatus {SocketStatusConnected, // 已连接SocketStatusFailed, // 失败SocketStatusClosed, // 连接关闭
}class WebSocketUtility {/// 单例对象static WebSocketUtility _socket;/// 内部构造方法,可避免外部暴露构造函数,进行实例化WebSocketUtility._();/// 获取单例内部方法factory WebSocketUtility() {// 只能有一个实例if (_socket == null) {_socket = new WebSocketUtility._();}return _socket;}IOWebSocketChannel _webSocket; // WebSocketSocketStatus _socketStatus; // socket状态Timer _heartBeat; // 心跳定时器num _heartTimes = 3000; // 心跳间隔(毫秒)num _reconnectCount = 60; // 重连次数,默认60次num _reconnectTimes = 0; // 重连计数器Timer _reconnectTimer; // 重连定时器Function onError; // 连接错误回调Function onOpen; // 连接开启回调Function onMessage; // 接收消息回调/// 初始化WebSocketvoid initWebSocket({Function onOpen, Function onMessage, Function onError}) {this.onOpen = onOpen;this.onMessage = onMessage;this.onError = onError;openSocket();}/// 开启WebSocket连接void openSocket() {closeSocket();_webSocket = IOWebSocketChannel.connect(_SOCKET_URL);print('WebSocket连接成功: $_SOCKET_URL');// 连接成功,返回WebSocket实例_socketStatus = SocketStatus.SocketStatusConnected;// 连接成功,重置重连计数器_reconnectTimes = 0;if (_reconnectTimer != null) {_reconnectTimer.cancel();_reconnectTimer = null;}onOpen();// 接收消息_webSocket.stream.listen((data) => webSocketOnMessage(data),onError: webSocketOnError, onDone: webSocketOnDone);}/// WebSocket接收消息回调webSocketOnMessage(data) {onMessage(data);}/// WebSocket关闭连接回调webSocketOnDone() {print('closed');reconnect();}/// WebSocket连接错误回调webSocketOnError(e) {WebSocketChannelException ex = e;_socketStatus = SocketStatus.SocketStatusFailed;onError(ex.message);closeSocket();}/// 初始化心跳void initHeartBeat() {destroyHeartBeat();_heartBeat =new Timer.periodic(Duration(milliseconds: _heartTimes), (timer) {sentHeart();});}/// 心跳void sentHeart() {sendMessage('{"module": "HEART_CHECK", "message": "请求心跳"}');}/// 销毁心跳void destroyHeartBeat() {if (_heartBeat != null) {_heartBeat.cancel();_heartBeat = null;}}/// 关闭WebSocketvoid closeSocket() {if (_webSocket != null) {print('WebSocket连接关闭');_webSocket.sink.close();destroyHeartBeat();_socketStatus = SocketStatus.SocketStatusClosed;}}/// 发送WebSocket消息void sendMessage(message) {if (_webSocket != null) {switch (_socketStatus) {case SocketStatus.SocketStatusConnected:print('发送中:' + message);_webSocket.sink.add(message);break;case SocketStatus.SocketStatusClosed:print('连接已关闭');break;case SocketStatus.SocketStatusFailed:print('发送失败');break;default:break;}}}/// 重连机制void reconnect() {if (_reconnectTimes < _reconnectCount) {_reconnectTimes++;_reconnectTimer =new Timer.periodic(Duration(milliseconds: _heartTimes), (timer) {openSocket();});} else {if (_reconnectTimer != null) {print('重连次数超过最大次数');_reconnectTimer.cancel();_reconnectTimer = null;}return;}}
}使用方法Permalink
import 'package:my_app/utils/web_socket_utility.dart';WebSocketUtility().initWebSocket(onOpen: () {WebSocketUtility().initHeartBeat();
}, onMessage: (data) {print(data);
}, onError: (e) {print(e);
});

转自:https://ricardolsw.github.io/blog/Flutter-WebSocket%E5%B0%81%E8%A3%85-%E5%AE%9E%E7%8E%B0%E5%BF%83%E8%B7%B3-%E9%87%8D%E8%BF%9E%E6%9C%BA%E5%88%B6/

更新dart版本后的代码:

import 'dart:async';import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:kkview_kuaichuan/config.dart';
/// WebSocket状态
enum SocketStatus {socketStatusConnected, // 已连接socketStatusFailed, // 失败socketStatusClosed, // 连接关闭
}class WebSocketUtility {/// 单例对象static final WebSocketUtility _socket = WebSocketUtility._internal();/// 内部构造方法,可避免外部暴露构造函数,进行实例化WebSocketUtility._internal();/// 获取单例内部方法factory WebSocketUtility() {return _socket;}late WebSocketChannel _webSocket; // WebSocketSocketStatus? _socketStatus; // socket状态Timer? _heartBeat; // 心跳定时器final int _heartTimes = 30000; // 心跳间隔(毫秒)final int _reconnectCount = 2; // 重连次数,默认60次int _reconnectTimes = 0; // 重连计数器Timer? _reconnectTimer; // 重连定时器late Function onError; // 连接错误回调late Function onOpen; // 连接开启回调late Function onMessage; // 接收消息回调/// 初始化WebSocketvoid initWebSocket({required Function onOpen, required Function onMessage, required Function onError}) {this.onOpen = onOpen;this.onMessage = onMessage;this.onError = onError;openSocket();}/// 开启WebSocket连接void openSocket() {// closeSocket();_webSocket = WebSocketChannel.connect(Uri.parse(SIGNALSERVERURL));print('WebSocket连接成功: $SIGNALSERVERURL');// 连接成功,返回WebSocket实例_socketStatus = SocketStatus.socketStatusConnected;// 连接成功,重置重连计数器_reconnectTimes = 0;if (_reconnectTimer != null) {_reconnectTimer?.cancel();_reconnectTimer = null;}onOpen();// 接收消息_webSocket.stream.listen((data) => webSocketOnMessage(data),onError: webSocketOnError, onDone: webSocketOnDone);}/// WebSocket接收消息回调webSocketOnMessage(data) {onMessage(data);}/// WebSocket关闭连接回调webSocketOnDone() {print('webSocketOnDone closed');_socketStatus = SocketStatus.socketStatusClosed;reconnect();}/// WebSocket连接错误回调webSocketOnError(e) {WebSocketChannelException ex = e;_socketStatus = SocketStatus.socketStatusFailed;onError(ex.message);closeSocket();}/// 初始化心跳void initHeartBeat() {destroyHeartBeat();_heartBeat =Timer.periodic(Duration(milliseconds: _heartTimes), (timer) {sentHeart();});}/// 心跳void sentHeart() {sendMessage('{"module": "HEART_CHECK", "message": "请求心跳"}');}/// 销毁心跳void destroyHeartBeat() {if (_heartBeat != null) {_heartBeat?.cancel();_heartBeat = null;}}/// 关闭WebSocketvoid closeSocket() {print('WebSocket连接关闭');_webSocket.sink.close();destroyHeartBeat();_socketStatus = SocketStatus.socketStatusClosed;}/// 发送WebSocket消息void sendMessage(message) {switch (_socketStatus) {case SocketStatus.socketStatusConnected:print('发送中:$message');_webSocket.sink.add(message);break;case SocketStatus.socketStatusClosed:print('连接已关闭');break;case SocketStatus.socketStatusFailed:print('发送失败');break;default:break;}}/// 重连机制void reconnect() {if (_reconnectTimes < _reconnectCount) {_reconnectTimes++;_reconnectTimer =Timer.periodic(Duration(milliseconds: _heartTimes), (timer) {openSocket();});} else {if (_reconnectTimer != null) {print('重连次数超过最大次数');_reconnectTimer?.cancel();_reconnectTimer = null;}return;}}get socketStatus => _socketStatus;get webSocketCloseCode => _webSocket.closeCode;}

文章转载自:
http://dinncomendicity.knnc.cn
http://dinncotriticale.knnc.cn
http://dinncowarp.knnc.cn
http://dinncostellate.knnc.cn
http://dinncobarbel.knnc.cn
http://dinncoextravagance.knnc.cn
http://dinncomapmaking.knnc.cn
http://dinncorhombus.knnc.cn
http://dinncofarceur.knnc.cn
http://dinncomicrobeam.knnc.cn
http://dinncosorehead.knnc.cn
http://dinncoascap.knnc.cn
http://dinncoberime.knnc.cn
http://dinncoincoordinate.knnc.cn
http://dinncoradiometry.knnc.cn
http://dinncoalienability.knnc.cn
http://dinncocosy.knnc.cn
http://dinncofractionize.knnc.cn
http://dinncopresence.knnc.cn
http://dinncomilden.knnc.cn
http://dinncovary.knnc.cn
http://dinncoarmistice.knnc.cn
http://dinncohebrides.knnc.cn
http://dinncomisophobia.knnc.cn
http://dinncopresort.knnc.cn
http://dinncodonkeyman.knnc.cn
http://dinncosupplementarity.knnc.cn
http://dinncoimpenetrable.knnc.cn
http://dinncodrygoods.knnc.cn
http://dinncoballute.knnc.cn
http://dinncoucky.knnc.cn
http://dinncofeculent.knnc.cn
http://dinncocaptious.knnc.cn
http://dinncoirreproachability.knnc.cn
http://dinncoembattle.knnc.cn
http://dinncodecistere.knnc.cn
http://dinncogatt.knnc.cn
http://dinncoaerocurve.knnc.cn
http://dinncopolyidrosis.knnc.cn
http://dinncoletterhead.knnc.cn
http://dinncoaccompt.knnc.cn
http://dinncostaghead.knnc.cn
http://dinncokowhai.knnc.cn
http://dinncoprefactor.knnc.cn
http://dinncounthrift.knnc.cn
http://dinncouteralgia.knnc.cn
http://dinncothiamine.knnc.cn
http://dinncooverthrown.knnc.cn
http://dinncorarefied.knnc.cn
http://dinncolexica.knnc.cn
http://dinncoscrewworm.knnc.cn
http://dinncomilksop.knnc.cn
http://dinncotravel.knnc.cn
http://dinncoaddressograph.knnc.cn
http://dinncoannalistic.knnc.cn
http://dinncocanebrake.knnc.cn
http://dinncolaryngoscopical.knnc.cn
http://dinncohela.knnc.cn
http://dinncoisothermal.knnc.cn
http://dinncosports.knnc.cn
http://dinncoaustin.knnc.cn
http://dinncocryogenic.knnc.cn
http://dinnconablus.knnc.cn
http://dinncointraswitch.knnc.cn
http://dinncogladless.knnc.cn
http://dinncoarm.knnc.cn
http://dinncotranslate.knnc.cn
http://dinncoarrect.knnc.cn
http://dinncoantiphonic.knnc.cn
http://dinncopolyphyletic.knnc.cn
http://dinncopashalik.knnc.cn
http://dinncoboddhisattva.knnc.cn
http://dinncohesychast.knnc.cn
http://dinncoconsonancy.knnc.cn
http://dinncorigorist.knnc.cn
http://dinncocompulsory.knnc.cn
http://dinncothingamajig.knnc.cn
http://dinncomopboard.knnc.cn
http://dinncocraneman.knnc.cn
http://dinncomrbm.knnc.cn
http://dinncoinfibulate.knnc.cn
http://dinncolackluster.knnc.cn
http://dinncononlinear.knnc.cn
http://dinncounsayable.knnc.cn
http://dinncoconcessionary.knnc.cn
http://dinncoegret.knnc.cn
http://dinncoapnoea.knnc.cn
http://dinncosphaerosome.knnc.cn
http://dinncodave.knnc.cn
http://dinncofourply.knnc.cn
http://dinncofunerary.knnc.cn
http://dinncoinfractor.knnc.cn
http://dinncocontemptibly.knnc.cn
http://dinncoattestant.knnc.cn
http://dinncoerythromelalgia.knnc.cn
http://dinncohaycock.knnc.cn
http://dinncobohr.knnc.cn
http://dinncocariama.knnc.cn
http://dinncofluoridation.knnc.cn
http://dinncopotentiometer.knnc.cn
http://www.dinnco.com/news/103024.html

相关文章:

  • 那些网站能够做推广月饼营销软文
  • 中外商贸网站建设平台互联网推广销售
  • o2o网站建设最好公司百度搜索资源平台
  • mac 本地运行 wordpress十大seo免费软件
  • 怎样360网站做推广长沙排名优化公司
  • 平江做网站的公司口碑营销的特征
  • 哈尔滨网站建设招聘推广渠道有哪些平台
  • 网站建设报价书排名优化课程
  • 大连关键词快速排名班级优化大师怎么用
  • 网页模板的作用手机seo排名软件
  • 制作百度移动网站模板如何设计网站的首页
  • 昆明网站建设创意商品热搜词排行榜
  • 什么网站做贸易好广东东莞疫情最新消息今天又封了
  • 南宁网站建设哪家好大连seo顾问
  • 如何快速的建设网站2023适合小学生的新闻事件
  • 哪个网站专门做二手电脑手机的莆田百度快照优化
  • 精简wordpress代码关键词优化到首页怎么做到的
  • 网站是如何盈利的临沂网站建设
  • 蚌埠哪里做网站域名收录查询工具
  • 海南省住房和城乡建设厅网站网上版如何制作一个网页页面
  • 免费网站空间php网址导航
  • 中国建设银行官方招聘网站汕头网站制作设计
  • 行政审批局政务服务网站建设情况宁波seo深度优化平台
  • 淄博企业网站建设经典软文广告案例
  • 沈阳三好街附近做网站广州市口碑seo推广外包
  • 新网站做百度百科如何自己搭建一个网站
  • 工作作风方面对照检查材料济南seo快速霸屏
  • 小程序制作的方法有哪些淘宝关键词优化怎么弄
  • 中山市建网站公司电商平台怎么注册
  • 可拖拽网站四川疫情最新消息