SocketIOException:客户端中出现意外的握手错误

时间:2012-12-20 02:40:29

标签: https dart

以下例外:

SocketIOException: Unexpected handshake error in client (OS Error: errno = -12268)
#0      _SecureFilterImpl.handshake (dart:io-patch:849:8)
#1      _SecureSocket._secureHandshake (dart:io:7382:28)
#2      _SecureSocket._secureConnectHandler._secureConnectHandler (dart:io:7294:21)
#3      _Socket._updateOutHandler.firstWriteHandler (dart:io-patch:773:64)
#4      _SocketBase._multiplex (dart:io-patch:408:26)
#5      _SocketBase._sendToEventHandler.<anonymous closure> (dart:io-patch:509:20)
#6      _ReceivePortImpl._handleMessage (dart:isolate-patch:37:92)

来自以下代码:

String url = "https://www.google.com";
HttpClient client = new HttpClient();
HttpClientConnection conn = client.getUrl(new Uri(url));
conn.onResponse = (HttpClientResponse resp) {
  print ('content length ${resp.contentLength}');
  print ('status code ${resp.statusCode}');
  InputStream input = resp.inputStream;
  input.onData = () {
    print(codepointsToString(input.read()));
  };
  input.onClosed = () {
    print('closed!');
    client.shutdown();
  };
};

请注意,如果我将网址替换为“http”而不是“https”,则会按预期工作。

Bug report is here.

2 个答案:

答案 0 :(得分:3)

更新:请参阅answer of William Hesse了解Dart版本&gt; = 1.12。


我与Dart SDK version 0.2.9.9_r16323有同样的错误。在the issue 7541

  

在使用安全网络之前,需要明确初始化SecureSocket库。我们正在努力在您第一次使用它时自动初始化,但尚未提交。要仅使用默认根证书(众所周知的证书颁发机构),请致电SecureSocket.initialize()   在你的main()例程中,在你进行任何网络之前。

因此,通过在代码之前添加SecureSocket.initialize(),它可以按预期工作。

r16384这个明确的initialization is optional

之后
  

SecureSocket.initialize()现在是可选的。如果你不调用它,就像你没有参数调用它一样。如果您明确地调用它,则必须在创建任何安全连接之前执行一次。 如果您正在制作服务器套接字,则需要明确调用它,因为它们需要证书数据库和密钥数据库的密码。

答案 1 :(得分:1)

自编写此问题以来,安全网络库已发生变化。没有SecureSocket.initialize()函数,许多其他方法和对象已更改名称。 Dart 1.12及更高版本的工作等效代码为:

import "dart:io";

main() async {
  Uri url = Uri.parse("https://www.google.com");`
  var client = new HttpClient();
  var request = await client.getUrl(url);
  var response = await request.close();
  var responseBytes = (await response.toList()).expand((x) => x);
  print(new String.fromCharCodes(responseBytes));
  client.close();
}