以下例外:
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”,则会按预期工作。
答案 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();
}