可以通过 Java 中的 Apache TelnetClient 连接到 AS400 吗?

Posted

技术标签:

【中文标题】可以通过 Java 中的 Apache TelnetClient 连接到 AS400 吗?【英文标题】:Can you connect to AS400 through Apache TelnetClient in Java? 【发布时间】:2020-03-17 18:10:15 【问题描述】:

我正在尝试使用 Java 中的 Apache 的 TelnetClient 连接到 AS400。 现在的目标是简单地逐行连接和读取屏幕并显示每一行。稍后我将重点介绍输入和交互。

当我通过 telnet 连接时,我的程序在尝试读取输入行时会“挂起”。我认为线程被阻止:line = bfIn.readLine() 因为这是应用程序停止的地方。它不会崩溃,它只是卡在那里。

如果我使用不同的主机和相同的程序连接到一个简单的 telnet 交换机,程序打印出页面就好了,所以我想知道是否有一个额外的步骤来专门连接到 AS400? 可以通过 Apache TelnetClient for java 连接到 AS400 吗?如果不是,如何通过java连接AS400并与页面交互(看看页面显示什么)?

这是我一直在使用的代码:

 import org.apache.commons.net.telnet.TelnetClient;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.OutputStreamWriter;

public class AutomatedTelnetClient 
     private TelnetClient telnet = new TelnetClient();
     private InputStream in;
     private PrintStream out;
     private String prompt = "%";

    public AutomatedTelnetClient(String server, String user, String password) 
        try 
            // Connect to the specified server
             telnet.connect(host, 23);
             in = telnet.getInputStream();
             out = new PrintStream(telnet.getOutputStream());
             BufferedReader bfIn = new BufferedReader(new InputStreamReader(in));
             PrintWriter writer = new PrintWriter(telnet.getOutputStream(), true);
             System.out.println("BufferedReader ready to be read: " + bfIn.ready());

             try 
                String line;
                while ((line = bfIn.readLine()) != null) 
                    System.out.println(line);
                
            
            catch (IOException e) 
                System.out.println("Exception");
                e.printStackTrace();
            

            telnet.disconnect();
            in.close();
            bfIn.close();

我认为可能发生的一个问题是 BufferedReader 可能无法获取 AS400 在连接时返回给它的内容,因此它无法正确读取它。

请注意 bufferedReader.ready() 返回错误。我已确保主机有效并且使用命令行连接工作。

【问题讨论】:

Windows/Linux原生telnet客户端能用吗? 你的意思是如果主机在本地 telnet 客户端上工作?如果是这样,是的。 您是否尝试过属于 Apache 公共库的 TelnetClientExample?我刚刚尝试构建和运行它,它似乎在 7.4 版上运行良好。这将帮助您确定它是否在您的代码中,或者它是否与您连接的系统有关。但它不使用 BufferedReader。 我尝试了 TelnetClientExample 并得到了回复。但是,响应中包含的字符大多不正确。不正确我的意思是这些字符看起来不是 ASCII(盒子里的小问号或奇怪的问号)。这是一个示例(注意方框内会带有小问号): [?3l[?7h[6;53H[?3l[?7h[1;1H[2J[0m [1;22H[1m[0m [1m] 更新:我删除了 ANSI 控制字符,似乎有更好的输出质量。 【参考方案1】:

标准 telnet 可以与 IBM i 一起使用,但它并不理想,因为 5250 协议是为“一次屏幕”“智能”终端设计的,而不是一次一行或一次字符的哑终端。

你知道TN5250J project吗?

tn5250j 是用 Java 编写的用于 AS/400 的 5250 终端仿真器。

对于移动访问,其他需要查看的内容是 IBM 提供的 IBM i Mobile Access。

【讨论】:

我认为有些东西带有“智能”终端。不,我没听说过。但不幸的是,我不需要终端仿真器。我需要访问 Java 中的页面,以便可以在 android 设备上显示它。我相信这个模拟器只会对桌面界面有所帮助,对吧?有没有办法通过Java一次使用一个字符或逐行使用? 任何显示为 5250 屏幕的东西都会被称为 *终端模拟器"play.google.com/store/apps/… 是的,像 Mocha TN5250 这样的东西很好,但如果有意义的话,我基本上需要将该功能嵌入到我的应用程序中。我确实需要他们提供的功能,但我正在尝试在我的应用程序中创建一个更简单的版本。 我建议从 TN5250J 开始...注意我已将链接更新到该网站的最新版本

以上是关于可以通过 Java 中的 Apache TelnetClient 连接到 AS400 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 Apache Apex 中的 application.java 类?

如何使用Java和apache poi选择excel中的所有单元格

在java中的apache exec执行命令时遇到问题

线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/commons/codec/DecoderException

使用 Java 写入数据库时​​ Apache Beam 管道中的异常处理

Apache POI在多线程中的tmp目录上获取java.io.IOException