首页 > 解决方案 > 来自 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);.

标签: javaandroidsocketsandroid-studio

解决方案


推荐阅读