【发布时间】:2020-01-03 15:12:38
【问题描述】:
我在 Nodejs 中编写了一个 wss 服务器,现在我正在尝试使用 Flutter 连接到这样的服务器。
这是 NodeJS 中的代码:
//Dependencies
const WebSocket = require('ws');
const fs = require('fs');
const https = require('https');
//Dependencies
//Server declarations
const server = https.createServer({
key: fs.readFileSync('pathTo/key.pem'),
cert: fs.readFileSync('pathTo/cert.pem')
});
server.listen(xxxx);
const wss = new WebSocket.Server({ server });
//Server declarations
wss.on('connection', function connection(ws)
{
ws.on('message', function incoming(message)
{
console.log('Received: ' + message);
ws.send('echo: ' + message);
});
ws.send('Connected!');
});
这是 Flutter 中的代码:
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:web_socket_channel/io.dart';
import 'package:connectivity/connectivity.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
class MyApp extends StatelessWidget
{
@override
Widget build(BuildContext context)
{
final title = 'LumenApp Prototype';
IOWebSocketChannel channel;
try
{
channel = new IOWebSocketChannel.connect('wss://xxxxxxxx.xxx.xxx:xxxx/');
MyHomePageState.noResponse = false;
}
catch(e)
{
MyHomePageState.noResponse = true;
}
return MaterialApp(
title: title,
theme: ThemeData(
primarySwatch: Colors.blue,
primaryTextTheme: TextTheme(
title: TextStyle(
color: Colors.yellow[600],
),
),
),
home: MyHomePage(
title: title,
channel: channel,
),
);
}
}
Flutter 上的错误是:WebSocketChannelException: WebSocketChannelException: HandshakeException: Handshake error in client (OS Error: CERTIFICATE_VERIFY_FAILED: self signed certificate(handshake.cc:354))
这发生在这个函数内部:
void initPlatformState()
{
widget.channel.stream.listen((message)
{
setState(() { noResponse = false; });
//Handle message...
},
onError: (error)
{
print(error);
if(mounted)
{
setState((){ noResponse = true;});
}
},
onDone: ()
{
if(mounted)
{
setState((){ noResponse = true; });
}
});
}
我使用了一个由 openssl 制作的自签名证书服务器端。
知道如何解决这个问题吗?
【问题讨论】:
-
第一个假设是您的 websocket 服务器没有 SSL 证书,因此无法运行 WSS。
-
@JoãoSoares 我使用 OpenSSL 获得了一个 ssl 密钥和一个 ssl 证书。
-
您是否测试过您的 WSS 在不是您的 Flutter 应用的其他客户端上正常工作?
-
@JoãoSoares 我尝试使用 Postman,但无论是使用 ws 还是使用 wss,它都不起作用,即使使用 ws 和 Flutter 也可以。
-
那里肯定发生了一些奇怪的事情,但您需要确保您的服务器正常工作,然后再继续查看您的 Flutter 应用程序是否存在问题。
标签: android ssl flutter websocket openssl