引入插件 :web_socket_channel: ^3.0.1
使用如下代码:
Dart
class _MyHomePageState extends State<MyHomePage> {
String text = "";
var textController = TextEditingController();
late IOWebSocketChannel channel;
void _incrementCounter() {
channel.sink.add(textController.text);
textController.text = "";
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
HttpClient httpClient = HttpClient();
/// 解决证书问题
httpClient.badCertificateCallback = (X509Certificate cert, String host, int port) {
// String PEM = "XXXXXX";// 证书信息
// if(cert.pem == PEM){
// return true;// 正式一致,则允许发送数据
// }
// return false;
/// 这里可写死true
return true;
};
channel = IOWebSocketChannel.connect(Uri.parse('ws://echo.websocket.org'), customClient: httpClient);
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text("WebSocket例子"),
),
body: StreamBuilder(
stream: channel.stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
text = "${snapshot.data}";
} else if (snapshot.connectionState == ConnectionState.done) {
text = "已断开连接,断开原因:${snapshot.error}";
} else if (snapshot.connectionState == ConnectionState.waiting) {
text = "连接中";
} else {
text = "...";
}
return Column(
children: [
Text(text),
TextField(
controller: textController,
),
TextButton(
onPressed: () {
channel.sink.close();
},
child: const Text("断开")),
TextButton(
onPressed: () {
setState(() {});
},
child: const Text("重连")),
],
);
}),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}