Dart将客户端套接字升级到WebSocket

Dart将客户端套接字升级到WebSocket,websocket,dart,flutter,certificate,Websocket,Dart,Flutter,Certificate,由于in Dart不允许直接设置(我需要进行证书检查),因此我希望与实例建立连接,然后使用WebSocket.fromUpgradedSocket构造函数从中创建WebSocket实例 这个想法最初是提出的 但是,我无法让它与以下代码一起工作(虽然我需要wss,但ws-works也不行): 这里sock是Socket类型,Socket是WebSocket类型,myListener是一个函数,它在收到消息时打印一些调试语句。我没有得到一个错误,但是我也没有进入监听器-当我用这一行替换前两行时,我会

由于in Dart不允许直接设置(我需要进行证书检查),因此我希望与实例建立连接,然后使用WebSocket.fromUpgradedSocket构造函数从中创建WebSocket实例

这个想法最初是提出的

但是,我无法让它与以下代码一起工作(虽然我需要wss,但ws-works也不行):

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

socket = await WebSocket.connect('ws://echo.websocket.org');    
我假设问题在于我的套接字“sock”没有升级,而前面提到的构造函数的声明明确指出:“从已经升级的套接字创建WebSocket。”


所以我的问题是,现有的Dart类是否可以将客户机(安全)套接字升级为升级的(安全)套接字?(这将允许将其转换为WebSocket实例)

使用
HttpClient
建立初始http(s)连接,然后
分离该套接字。下面是一个http示例。您应该能够适应https。请注意初始连接是如何通过http建立的,但通过添加适当的请求头进行升级的。(您需要根据websocket服务器所需的安全方案调整标题。)

Random r=new Random();
String key=base64.encode(List.generate(8,()=>r.nextInt(255));
HttpClient=HttpClient(/*此处为可选安全上下文*/);
HttpClientRequest=wait client.get('echo.websocket.org',80,
“/foo/ws?api_key=myapikey”);//在此处形成正确的url
request.headers.add('Connection','upgrade');
添加('Upgrade','websocket');
request.headers.add('sec-websocket-version','13');//在此处插入正确的版本
request.headers.add('sec-websocket-key',key);
HttpClientResponse response=等待请求。关闭();
//todo检查状态代码、钥匙等
套接字=等待响应。detachSocket();
WebSocket ws=WebSocket.fromUpgradedSocket(
插座
服务器端:错,
);

非常感谢您的详细回答。对于ws,您的示例在使用request=await client.get('echo.websocket.org',80,”)时开箱即用;对于任何感兴趣的人来说,该示例也可以通过使用Uri=Uri.parse(“);request=await client.getUrl(Uri)与wss一起使用;请注意,我必须在parse命令中使用https,而不是wss。现在StackOverflow从parse命令中创建了一个链接。重要的是,它应该从https://...
socket = await WebSocket.connect('ws://echo.websocket.org');    
  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,
  );