我正在尝试从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网络共享在我的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);
期间发生错误。