Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “;网络无法访问”;来自Android,但在Python客户端工作得很好_Java_Android_Sockets_Android Studio - Fatal编程技术网

Java “;网络无法访问”;来自Android,但在Python客户端工作得很好

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

我正在尝试从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连接我的电脑和我的手机,用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与服务器连接呢?