start method
启动服务,只启动一次
Implementation
Future<void> start() async {
if (_server != null) return;
try {
_server = await HttpServer.bind(InternetAddress.loopbackIPv4, _preferPort);
_port = _server!.port;
}on SocketException catch (e) {
// 2. 如果是端口被占用,改用随机端口
final code = e.osError?.errorCode;
if (code == 48 || code == 98) {
// 让系统分配一个空闲端口
_server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
_port = _server!.port;
} else {
rethrow; // 其他错误还是抛出去
}
} catch (e) {
dev.log(' 服务启动错误: $e');
rethrow;
}
_server!.defaultResponseHeaders.chunkedTransferEncoding = false;
dev.log(' 服务启动: http://127.0.0.1:$port');
_server!.listen(_handleRequest, onError: (e) {
dev.log(' 服务报错: $e');
});
}