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

本文详细介绍了如何在Dart项目中使用Socket.IO进行WebRTC通信,包括添加本地socket.io-client-dart依赖,以及处理自定义服务器的签名问题,并展示了如何使用async和await进行异步操作。
摘要由CSDN通过智能技术生成


本文开始介绍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');
  }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 这个错误可能是因为DNS解析出错导致的。可以尝试以下几种解决方法: 1. 检查网络连接是否正常,确保能够正常访问该网站。 2. 检查DNS服务器是否可用,如果不可用,可能需要更换DNS服务器。 3. 检查是否在hosts文件中添加了该网站的IP地址。 4. 如果以上方法都没有解决问题,可以尝试使用代理服务器进行请求。 5. 如果是在国内使用,可以尝试使用国内镜像,例如 https://pub.flutter-io.cn 如果还是无法解决问题,建议检查下网络环境,或者联系服务器管理员查看是否存在屏蔽. ### 回答2: 在Dart中使用http.head请求页面时,如果报错"Failed host lookup: 'pub.flutter-io.cn'",这通常是因为无法解析目标主机名。这可能是由于以下几个原因引起的: 1. 您的网络连接存在问题,导致无法解析主机名。您可以尝试检查您的网络连接,确保您的网络正常工作。 2. 您的防火墙或安全软件可能阻止了Dart应用程序访问目标主机。您可以尝试禁用防火墙或安全软件,然后再次尝试请求页面。 3. Dart应用程序的DNS配置可能出错,无法正确解析主机名。您可以尝试清除您的DNS缓存或手动配置正确的DNS服务器。 4. 您的hosts文件可能含了错误的配置,导致无法解析指定的主机名。您可以尝试查看并编辑您的hosts文件,确保没有错误的配置。 5. 您的代码中可能存在错误,导致请求的主机名被错误地设置为'pub.flutter-io.cn'。您可以仔细检查您的代码,确保正确设置了目标主机。 解决这个问题的具体方法可能因具体情况而异,您可以根据上述建议逐一排查,找到导致问题的原因,并采取相应措施来解决。另外,您还可以尝试使用其他网络工具(如curl、浏览器等)来验证请求是否成功,以确定问题的具体原因。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简简单单lym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值