在Android上“网络无法访问”,但在Python客户端上效果很好

时间:2018-09-07 17:20:35

标签: 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 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);期间发生错误。

0 个答案:

没有答案