gpt4 book ai didi

websocket - Dart 升级客户端 Socket 到 WebSocket

转载 作者:IT王子 更新时间:2023-10-29 06:51:25 25 4
gpt4 key购买 nike

WebSocket在 Dart 中不允许直接设置 SecurityContext (我需要进行证书检查),我想与 SecureSocket 建立连接实例,然后使用 WebSocket.fromUpgradedSocket 构造函数从中创建一个 WebSocket 实例。

这个想法最初是建议的here .

但是,我无法使用以下代码(虽然我想要 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');    

我假设问题是我的 Socket 'sock' 没有升级,而 WebSocket source code对于所提到的构造函数明确指出:“从已升级的套接字创建 WebSocket。”。

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

最佳答案

使用HttpClient 建立初始的http(s) 连接,然后分离 套接字。这是 http 的示例。你应该可以适应https。请注意初始连接是如何通过 http 建立的,但通过添加适当的请求 header 进行升级。 (您需要调整 header 以适应您的 websocket 服务器所需的安全方案。)

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

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,
);

关于websocket - Dart 升级客户端 Socket 到 WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53721745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com