Dart 将客户端 Socket 升级为 WebSocket

2024-05-01

Since WebSocket https://api.dartlang.org/stable/2.1.0/dart-io/WebSocket-class.html在 Dart 中不允许直接设置安全上下文 https://api.dartlang.org/stable/2.1.0/dart-io/SecurityContext-class.html(我需要进行证书检查),我想与安全套接字 https://api.dartlang.org/stable/2.1.0/dart-io/SecureSocket-class.html实例,然后使用 WebSocket.fromUpgradedSocket 构造函数从中创建一个 WebSocket 实例。

这个想法最初是建议的here https://stackoverflow.com/questions/49354396/add-headers-to-a-securesocket-or-securitycontext-to-webspcket?rq=1.

但是,我无法让它与以下代码一起使用(虽然我想要 wss,但甚至 ws 都不起作用):

sock = await Socket.connect('ws://echo.websocket.org', 80);
socket = WebSocket.fromUpgradedSocket(sock, serverSide: false);
socket.listen(myListener);
// Send some dummy data
var list = utf8.encode("hello");
var data = list is Uint8List ? list : Uint8List.fromList(list);
socket.add(data);

这里的sock是Socket类型,socket是WebSocket类型,myListener是一个函数,在收到消息时打印一些调试语句。我没有收到错误,但也没有进入侦听器 - 当我用此行替换前两行时,我会这样做:

socket = await WebSocket.connect('ws://echo.websocket.org');    

我认为问题是我的套接字“袜子”没有升级,而WebSocket 源代码 https://github.com/dart-lang/sdk/blob/master/sdk/lib/_http/websocket.dart对于提到的构造函数,明确指出:“从已升级的套接字创建 WebSocket。”。

所以我的问题是,现有的 Dart 类是否可以将客户端 (Secure-)Socket 升级到升级后的 (Secure-)Socket? (然后可以将其转换为 WebSocket 实例)


Use the HttpClient建立初始 http(s) 连接,然后detach插座。这是一个使用 http 的示例。你应该能够适应https。请注意初始连接是如何通过 http 建立的,但通过添加适当的请求标头进行升级。 (您需要使标头适应您的 websocket 服务器所需的安全方案。)

  Random r = new Random();
  String key = base64.encode(List<int>.generate(8, (_) => r.nextInt(256)));

  HttpClient client = HttpClient(/* optional security context here */);
  HttpClientRequest request = await client.get('echo.websocket.org', 80,
      '/foo/ws?api_key=myapikey'); // form the correct url here
  request.headers.add('Connection', 'upgrade');
  request.headers.add('Upgrade', 'websocket');
  request.headers.add('sec-websocket-version', '13'); // insert the correct version here
  request.headers.add('sec-websocket-key', key);

  HttpClientResponse response = await request.close();
  // todo check the status code, key etc
  Socket socket = await response.detachSocket();

  WebSocket ws = WebSocket.fromUpgradedSocket(
    socket,
    serverSide: false,
  );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart 将客户端 Socket 升级为 WebSocket 的相关文章

随机推荐