您可以使用Socket.connect() 连接客户端的套接字,使用ServerSocket.bind() 监听服务器端的传入连接。您可以使用socket.write(message); 通过套接字发送数据,并使用socket.listen(); 监听响应。
示例客户端代码:
Socket.connect("localhost", 9999).then((socket) {
print('client connected : ${socket.remoteAddress.address}:${socket.remotePort}');
socket.listen((data) {
print("client listen : ${String.fromCharCodes(data).trim()}");
}, onDone: () {
print("client done");
socket.destroy();
});
socket.write(message);
});
示例服务器代码:
void listen() {
ServerSocket.bind(InternetAddress.anyIPv4, 9999).then((ServerSocket server) {
server.listen(handleClient);
});
}
void handleClient(Socket client) {
print('server incoming connection from ${client.remoteAddress.address}:${client.remotePort}');
client.listen((data) {
print("server listen : ${String.fromCharCodes(data).trim()}");
setState(() {
_incomingMessage = String.fromCharCodes(data).trim();
});
}, onDone: () {
print("server done");
});
client.close();
}
请参考:https://jamesslocum.com/blog/post/67566023889
您可以在 github 上找到 client 和 server 的完整源代码
更新:如果您想使用相同的小部件可以听和写,您可以参考此代码。你应该开始在构造函数中监听套接字。
示例代码:
import 'dart:io';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key) {
listen();
}
void socketSend(String message) {
Socket.connect("localhost", 9999).then((socket) {
print('client connected : ${socket.remoteAddress.address}:${socket.remotePort}');
socket.listen((data) {
print("client listen : ${String.fromCharCodes(data).trim()}");
}, onDone: () {
print("client done");
socket.destroy();
});
socket.write(message);
});
}
void listen() {
ServerSocket.bind(InternetAddress.anyIPv4, 9999).then((ServerSocket server) {
server.listen(handleClient);
});
}
void handleClient(Socket client) {
print('server incoming connection from ${client.remoteAddress.address}:${client.remotePort}');
client.listen((data) {
print("server listen : ${String.fromCharCodes(data).trim()}");
}, onDone: () {
print("server done");
});
client.close();
}
@override
Widget build(BuildContext context) {
final myController = TextEditingController();
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const Text("socket test"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(controller: myController),
ElevatedButton(onPressed: () => socketSend(myController.text), child: const Text("Send")),
],
),
),
),
);
}
}
端口80 也是HTTP 的保留端口。您不应使用此端口进行测试。