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 实例)