java - 来自 Android 的“网络无法访问”,但在 Python 客户端上运行良好
问题描述
我正在尝试从 Android 应用程序连接到 Python SSLSocket。只要我与服务器位于同一网络中,我就可以使用 Python 客户端从我的 PC 和使用 Java 客户端的 Android 手机成功连接。
如果我使用移动互联网,Android应用程序突然无法连接到服务器,出现以下错误:
failed to connect to /2a02:foo:bar:11f7 (port 4321) from /:: (port 0):
connect failed: ENETUNREACH (Network is unreachable)
奇怪的部分来了:如果我使用 USB 将我的 PC 连接到我的手机并使用 USB-Tethering 通过移动连接在我的 PC 上访问互联网,我可以连接到服务器!因此,一方面不同的网络不会成为问题,因为它使用 Python frm 两个网络都可以工作,但另一方面它在 Android 应用程序上失败,具体取决于网络。
这是我的代码:
private void openConnection() {
try {
SSLSocketFactory factory = createFactory();
long time = System.currentTimeMillis();
SSLSocket sslsocket = (SSLSocket) factory.createSocket("2a02:foo:bar:11f7", 4321);
out = new PrintWriter(sslsocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(sslsocket.getInputStream()));
out.write("password");
out.flush();
running = true;
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public SSLSocketFactory createFactory() {
InputStream caInput = null;
try {
caInput = context.getAssets().open("server.crt");
Certificate ca = CertificateFactory
.getInstance("X.509").generateCertificate(caInput);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
if (caInput != null) {
try {
caInput.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
错误发生在factory.createSocket("2a02:foo:bar:11f7", 4321);
.
解决方案
推荐阅读
- c++ - 某种方式来判断文件是否是带有 ssh_scp_request_get_permissions 或其他函数 libssh 的符号链接
- sql-server - 尝试按字母数字值排序时传递给 LEFT 或 SUBSTRING 函数的长度参数无效
- python - 将 2D numpy 数组转换为一个 Dataframe 行
- javascript - 使用正则表达式从代码中提取全局浮点数
- optimization - 可以在函数之间应用公共子表达式消除吗?
- java - 如何使用 Java 中的 iText 库遍历 PDF 的内部结构?
- build - 在插件包中包含依赖项(汇总)
- react-native - 向 FlatList 添加数据会清除整个列表
- java - 从文件 Graphics2D 添加 CustomFont - Java
- ios - 将裁剪后的 UIImage 保存到 CGPath