4

以下例外:

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();
  };
};

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

错误报告在这里。

4

2 回答 2

3

更新:请参阅William Hesse的 Dart 版本 >= 1.12 的答案。


我有同样的错误Dart SDK version 0.2.9.9_r16323。在问题 7541 中

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

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

r16384之后,此显式初始化是可选的

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

于 2012-12-20T07:37:36.840 回答
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();
}
于 2015-10-22T14:30:32.067 回答