java - Android + JDBC : No route to host (it works on the desktop, 为什么不在 Android 上?)

标签 java android sql jdbc ibm-midrange

我在网站上进行了搜索,但没有找到能解决我的问题的帖子。

我编写了一个桌面应用程序(Java/swing/JDBC)来通过 JDBC 连接到本地数据库。该数据库托管在 IBM i 系列 (AS400) 上(尽管我非常确定这不是 AS400 独有的问题),并且仅在内部网络上可用。我正在努力将该应用程序转换为 Android 应用程序,以便通过无线连接在仓库中使用。

我的 JDBC 连接位于它自己的线程中。该应用程序在尝试连接之前要求用户输入用户名/密码。连接每次都会失败,并显示相同的消息:java.sql.SQLException:应用程序请求者无法建立连接。 (没有到主机的路由)

这是有问题的代码:

            try 
    {
        // Use the AS400 driver.
        DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
        // Now connect
        connection = DriverManager.getConnection(
                "jdbc:as400://" + IP_ADDRESS + "/" + SCHEMA + 
                ";naming=sql;errors=full",
                USER_ID, PASSWORD);
        System.out.println("Connection established using the AS400 driver(s)");
    }
    catch(Exception as400) 
    {
        String message = "Error setting driver and connection using\n " 
                +  "the AS400 drivers. The error message is as follows:\n " 
                +  as400.getMessage();
        System.out.println(message);
        throw new Exception(message);
    }

它注册驱动程序,然后点击没有到主机的路由,暂停一秒钟,然后抛出一个错误,完全停止设备,而不是让我的错误处理程序安全地关闭应用程序。

我进行了双重(三重)检查,以确保正确传递凭据,并且正确设置 IP 和架构。该代码是我的桌面代码的直接副本。唯一的区别是我使用针对 Android 而不是桌面优化的 jar。该 jar 仅包含 native AS400 代码和 Java 之间的转换层,但工作方式与任何 SQL jar 相同。

这是我们整个公司使用的主要数据库服务器。它始终可用并且在其上启用了 SQL。我正在使用物理 Android 设备(不是模拟设备)对此进行测试,并且它已连接到我们的内部无线网络。

关于如何解决这个问题或者甚至是寻找方向有什么建议吗?尽管都使用 JDBC,但为什么桌面和我的 Android 之间存在如此大的差异?我需要为地址解析做一些特殊的事情或类似的事情吗? Google-fu 让我很失望。感谢您的帮助!

最佳答案

无线流量因公司安全策略而受到限制的情况并不罕见。

验证您是否可以连接到 DRDA (tcp 端口 446)从无线网络上的设备访问 IBM i。

参见TCP/IP Ports Required for iSeries Access for Windows了解更多信息。


JTOpen/工具箱有一个proxy mode如果安全要求不允许直接访问 IBM i。

Figure 1: How a standard client and a proxy client connect to a server

JTOpen/Toolbox jar 的轻量级版本也更适合安装在 CPU 和内存受限的环境中,例如 Android 设备。

Figure 2: Size comparison of proxy JAR files and standard JAR files

完整的 JTOpen/Toolbox 可以作为代理服务器运行,如下所示:

java -cp jt400.jar com.ibm.as400.access.ProxyServer -verbose -port 3470

代理服务器选项添加到您的连接字符串中:

jdbc:as400:<url>;proxy server=<proxy server address:port>

关于java - Android + JDBC : No route to host (it works on the desktop, 为什么不在 Android 上?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409271/

相关文章:

java - Java 中的 JSON 数组语法

java - JPA 中的最大可能日期

java - 如何获得 vector 输出?

sql - 根据计数更新

java - 如何为 orientdb 嵌入式设置 jmh 测试?

android - 任务 ':compileDebugJavaWithJavac' 的 Apache Cordova 执行失败

java - 如何在android studio中定义通用输入常量?

sql - 如何选择名称以相同前缀开头的列?

android - 如何将两个查询合并为一个?

android - 设置默认的 adb logcat 输出格式