flutter笔记-webrtc使用1:依赖本地包socket.io-client

文章目录

  • 1. 示例工程
  • 2. yaml 修改
  • 3. 使用
  • 4. socketio 关于自定义服务器自定义签名的问题
  • 封装成async和await方式

本文开始介绍webrtc的使用,阅读本文的前提是假设你已经使用过webrtc,了解webrtc的交互机制,不了解的可以看之前的文章: WebRTC系列-WebRTC基础(四)连接建立时序图及运行机制,本文使用的信令服务是基于socketio 2.x的版本,所以下面介绍dart中如何本地依赖socket.io-client包;
通过本文你将学会如何添加本地的dart包到自己的项目,将了解如何使用socketio;
Dart大多数情况下都是直接适用pub的方式从网站下载下来使用。如果需要将源码下载到指定的目录去使用,就需要使用yaml添加本地依赖的方式了;这里使用socket.io-client-dart本地添加的方式介绍:

1. 示例工程

示例项目的配置如下:
在这里插入图片描述
也就是如下的文件关系:

...dart
........depends
...............socket.io-client-dart

2. yaml 修改

上面介绍了工程的文件夹结构,接着就需要修改主工程的yaml文件了;修改如下:

dependencies:
  http: ^1.2.1
  socket_io_client:
    path: ./depends/socket.io-client-dart/

这里的socket_io_client,是依赖项目yaml配置的包名;然后就是配置库的相对路径了;
之后执行 dart pub get或flutter pub get, 命令会自行下载socket_io_client中的库依赖。

3. 使用

在主项目的文件中使用和pub的方式一直:
1.引入头文件 import 'package:socket_io_client/socket_io_client.dart' as IO;

  1. 调用示例:
void main(List<String> args) async {
  // 应用自定义的 HTTP Overrides
  // 创建 Socket.IO 客户端
  IO.Socket socket = IO.io('https://39.97.110.12:443', <String, dynamic>{
    'transports': ['websocket'], // 指定使用 WebSocket 传输
  });

  // 连接到服务器
  socket.connect();

  // 监听连接事件
  socket.onConnect((_) {
    print('Connected');
    socket.emit('join', '123456');
  });

  // 监听收到的消息
  socket.on('event', (data) => print(data));

  // 监听断开连接事件
  socket.onDisconnect((_) => print('Disconnected'));

  // 监听来自服务器的消息
  socket.on('joined', (data) {
    print('Joined:${data}');
  });
  socket.on('message', (data) {
    print('Joined${data}');
  });

  // 监听连接错误事件
  socket.on('error', (data) {
    print('Error');
    print(data);
  });

  socket.on("connect_error", (data) => print('Connect error: $data'));
}

上面的代码展示了socketio的简单使用;

4. socketio 关于自定义服务器自定义签名的问题

大多数我们测试的时候使用的都是自定义签名的https服务,这时候使用isocketo的client是连接不上的;需要配置如下:

class MyHttpOverrides extends HttpOverrides {
  
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback = (X509Certificate cert, String host, int port) {
        // 接受所有证书,包括自签名证书
        return true;
      };
  }
}

然后在调用socketio前如下调用:

 // 应用自定义的 HTTP Overrides
  HttpOverrides.global = MyHttpOverrides();

注意引入sdk依赖库:import 'dart:io';

测试服务在git上:WebRTCDemo

dart测试展示:
在这里插入图片描述

封装成async和await方式

async和await 是类似java的一种同步的方式去异步低啊用方法,并等待返回的一种方式;这种方式的代码看起来会比较好;改造上面的代码如下:

Future<bool> SocketIOConnect(IO.Socket socket) {
  Completer<bool> completer = Completer<bool>();

  // 监听连接事件
  socket.onConnect((_) {
    sleep(Duration(milliseconds: 100));
    print('Connected sucess!!!');
    completer.complete(true);
    // socket.emit('join', '123456');
  });

  // 监听连接错误事件
  socket.on('connect_error', (data) {
    print('Connect error: $data');
    completer.complete(false);
  });

  // 监听连接超时事件
  socket.on('connect_timeout', (data) {
    print('Connect timeout: $data');
    completer.complete(false);
  });

  // 返回 Future 对象
  return completer.future;
}
void testSocketIo() async {
  // 创建 Socket.IO 客户端
  IO.Socket socket = IO.io('https://39.97.110.12:443', <String, dynamic>{
    'transports': ['websocket'], // 指定使用 WebSocket 传输
  });

  bool connected = await SocketIOConnect(socket);
  if (connected) {
    print('Socket connected');
    socket.emit('join', '123456');

    // 监听收到的消息
    socket.on('event', (data) => print(data));

    // 监听断开连接事件
    socket.onDisconnect((_) => print('Disconnected'));

    // 监听来自服务器的消息
    socket.on('joined', (data) {
      print('Joined: $data');
    });
    socket.on('message', (data) {
      print('Message: $data');
    });

    // 监听连接错误事件
    socket.on('error', (data) {
      print('Error');
      print(data);
    });

    socket.on('connect_error', (data) => print('Connect error: $data'));
  } else {
    print('Socket connection failed');
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构】初步认识ArrayList与顺序表

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

【线性代数 C++】求逆矩阵

对于 n n n阶矩阵 A A A&#xff0c;如果有 n n n阶矩阵 B B B&#xff0c;使 A B B A E ABBAE ABBAE&#xff0c;则说 A A A是可逆的&#xff0c;并把 B B B称为 A A A的逆矩阵. A A A的逆矩阵记作 A − 1 A^{-1} A−1&#xff0c;则 B A − 1 BA^{-1} BA−1.若 ∣ A ∣ ≠…

二、OSPF协议基础

基于SPF算法&#xff08;Dijkstra算法&#xff09;的链路状态路由协议OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09; 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…

59、回溯-括号生成

思路&#xff1a; 括号是成对出现&#xff0c;首先左括号可以放n个&#xff0c;右括号也可以放n个。如果当前左括号放了3了&#xff0c;右括号放了4个&#xff0c;错了&#xff0c;如果左括号放了5个&#xff0c;右括号放了4个。可以&#xff0c;继续放右括号即可。所以可以设…

linux系统安全及应用【上】

目录 1.账号安全控制 1系统账号清理 2密码安全控制 1 对已经存在的用户账号进行控制 2 对新建的用户密码默认设置 3 历史命令和终端自动注销的安全管理 1 历史命令的限制 2. 用户切换管理 1 su命令的使用 2 ssh 3.授权用户管理 1 sudo命令 2 sudo用户别名 3 查看su…

Vuforia AR篇(三)— AR模型出场效果

目录 前言一、AR模型出场二、AR出场特效三、添加过渡效果四、效果 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 一、AR模型出场 创建ARCamer…

【Go语言快速上手(四)】面向对象的三大特性引入

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. 初识GO中的结构…

深度学习中的子空间、线性变换和矩阵概念应用

1.表示子空间 在深度学习中&#xff0c;“不同的表示子空间”通常是指模型通过不同的参数&#xff08;例如权重矩阵&#xff09;将输入数据映射到不同的高维空间&#xff0c;这些空间被称为表示子空间。每个子空间都能够捕获输入数据中不同的特征或模式。以下是一些详细解释&am…

软考-论文写作-论架构风格论文

题目 素材 框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员线上开展各项工作以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合实践,以委员履职系统为例,主要讨论软件…

使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具&#xff0c;比SpeechRecognition功能多安装也很简单&#xff1b; 官方介绍&#xff1a;FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff…

verilog中比较器的代码用法

在 verilog 中以大于“>”&#xff0c;等于””&#xff0c;小于”<”&#xff0c;大于等于”>”&#xff0c;小于等于”<”&#xff0c;不等于”!”表示&#xff0c;以大于举例&#xff0c;如 c a > b ;表示如果 a 大于 b&#xff0c;那么 c 的值就为 1&#x…

网盘——文件重命名

文件重命名具体步骤如下&#xff1a; 目录 1、具体步骤 2、代码实现 2.1、添加重命名文件的槽函数 2.2、关联重命名文件夹信号槽 2.3、添加重命名文件的协议 2.4、添加槽函数定义 2.5、服务器 2.6、添加重命名文件的case 2.7、客户端接收回复 3、测试 3.1、点击重命…

【AIGC调研系列】Bunny-Llama-3-8B-V与其他多模态大模型相比的优劣

Bunny-Llama-3-8B-V作为基于Llama-3的多模态大模型&#xff0c;其优势主要体现在以下几个方面&#xff1a; 性能超越其他模型&#xff1a;根据我搜索到的资料&#xff0c;Bunny-Llama-3-8B-V在多个主流Benchmark上表现良好&#xff0c;超越了LLaVA-7B、LLaVA-13B、Mini-Gemini…

汽车企业安全上网解决方案

需求背景 成立于1866年的某老牌汽车服务独立运营商&#xff0c;目前已经是全球最大的独立汽车服务网络之一&#xff0c;拥有95年的历史&#xff0c;在全球150多个国家拥有17,000多个维修站&#xff0c;始终致力于为每一位车主提供高品质&#xff0c;可信赖的的专业汽车保养和维…

智慧文旅:引领旅游产业智慧升级的创新模式

一、智慧文旅是什么&#xff1f; 智慧文旅是指以当地特色文化为核心&#xff0c;借助现代科技手段&#xff0c;实现旅游景区全面智慧升级的旅游模式。在智慧文旅中&#xff0c;新一代信息网络技术和装备得到充分运用&#xff0c;文化旅游基础设施得到新建和改善&#xff0c;特…

OpenCV鼠标绘制线段

鼠标绘制线段 // 鼠标回调函数 void draw_circle(int event, int x, int y, int flags, void* param) {cv::Mat* img (cv::Mat*)param;if (event cv::EVENT_LBUTTONDBLCLK){cv::circle(*img, cv::Point(x, y), 100, cv::Scalar(0, 0, 255), -1);} }// 鼠标回调函数 void dra…

牛客NC199 字符串解码【中等 递归,栈的思想 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4e008fd863bb4681b54fb438bb859b92 相同题目&#xff1a; https://www.lintcode.com/problem/575 思路 解法和基础计算器1&#xff0c;2,3类似,递归参考答案C struct Info {string str;int stopindex;Info(str…

react —— useState 深入

基础用法 useState Hook 提供了这两个功能&#xff1a; State 变量 在第一次重新渲染期间&#xff0c;这将具有作为参数传递的值State setter 函数 set 函数将允许将状态的值更新为不同的值&#xff0c;如果 set 函数中提供的值不同&#xff0c;则将触发重新渲染。 注意&…