我正在尝试让我在 Android Studio 中开发的 android flutter 应用程序连接到 Linux 服务器。使用 Android 模拟器可以正常连接,但在我的物理设备上测试时却无法连接。
Socket? _socket;
Future<void> connect({
required String ip,
required int port,
}) async {
try {
_socket = await Socket.connect(ip, 3000);
stream = _socket!.asBroadcastStream();
} on Exception catch(e){
print("Error: $e");
}
print(ip);
print(port);
//
}
使用物理设备进行测试时,除了不同的端口地址之外,它总是会产生以下错误:
I/flutter (20418): Error: SocketException: No route to host (OS Error: No route to host, errno = 113), address = 10.2.19.104, port = 33064
我尝试过各种物理手机。只有一个有效。其他人给出相同的错误消息。更改网络设置似乎没有任何效果。
这不是 Flutter 错误,这是一个错误,因为错误来自操作系统。基本上,发生的情况是,当操作系统向网络请求 IP 时,没有人响应,这就是为什么它告诉您它找不到主机来路由 IP。下载像 pingtool for android 这样的应用程序并尝试以这种方式 ping,很可能会超时。
尝试这两件事,第一个是连接到端口 80 上的 Google IP,发送 'html1.1 ',如果您的路由器有网络界面,还可以尝试连接到路由器。在日志中,您应该看到类似以下内容:
在 1,537 毫秒内重新启动应用程序。 我/颤振(8643):142.250.64.206 我/颤振(8643):80 我/颤振(8643):HTTP/1.0 400错误请求...
如果手机有互联网,这应该可以。
import 'dart:io';
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
Socket? socket;
Future<void> connect({
required String ip,
required int port,
}) async {
try {
Socket.connect(ip, port).then((Socket sock) {
socket = sock;
socket!.write('html1.1\r\n\r\n');
socket!.listen((data) {
print(String.fromCharCodes(data).trim());
});
});
} on Exception catch (e) {
print("Error: $e");
}
print(ip);
print(port);
//
}
return MaterialApp(
title: 'Material App',
home: Scaffold(
appBar: AppBar(
title: const Text('Material App Bar'),
),
body: Center(
child: Column(
children: [
TextButton(
onPressed: () {
connect(ip: '142.250.64.206', port: 80);
},
child: const Text('Connect http gogole.com'),
),
TextButton(
onPressed: () {
connect(ip: '10.2.19.1', port: 80);
},
child: const Text('Connect http router'),
),
],
),
),
),
);
}
}