Java “;网络无法访问”;来自Android,但在Python客户端工作得很好
我正在尝试从Android应用程序连接到Python SSLSocket。只要我与服务器处于同一网络中,我就可以使用Python客户端从我的PC和使用Java客户端从我的Android手机成功连接 如果我使用移动互联网,Android应用程序突然无法再连接到服务器,出现以下错误:Java “;网络无法访问”;来自Android,但在Python客户端工作得很好,java,android,sockets,android-studio,Java,Android,Sockets,Android Studio,我正在尝试从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 i
failed to connect to /2a02:foo:bar:11f7 (port 4321) from /:: (port 0):
connect failed: ENETUNREACH (Network is unreachable)
奇怪的部分来了:如果我用USB连接我的电脑和我的手机,用USB连接在我的电脑上通过移动连接上网,我可以连接到服务器!因此,一方面,不同的网络不会成为问题,因为它使用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)期间代码>“网络不可访问”是一个IP问题(事实上,在您的情况下是IPv6),而不是“SSL”问题。确保您的服务器确实可以通过IPv6从任何地方访问。像“tcptraceroute”和“mtr”这样的工具可能会有所帮助。谢谢您提供的信息。但是,如何可能使用手机的移动互联网连接无法访问,但如果我通过手机的互联网连接使用PC,它会工作?在您的移动互联网上,客户端可能根本没有IPv6地址,因此无法仅通过IPv6与服务器联系。相反,您应该确保您的服务器是双栈(IPv4和IPv6),在DNS中使用解析为两个IP的名称,并在工厂中仅使用该名称。createSocket
。如果客户端操作系统/网络配置正确,它将根据自己的能力选择IPv4或IPv6。服务器仅为IPv6,因为我没有全局IPv6地址。我刚刚检查了一下,它实际上表明我在移动互联网上没有IPv6地址。但是,尽管我的手机没有IPv6地址,我的电脑怎么可能通过我的手机通过IPv6与服务器连接呢?