Apache Telnet客户端未接收非ASCII字符

发布于 2025-01-31 19:43:11 字数 1145 浏览 3 评论 0原文

我一直在尝试使用org.apache.commons.net.telnet.telnet.telnetclient,并且我很难接收非accii字符(在我的情况下,polishs chars,例如ą,ę,ę,,还有其他很少的)。问题不在服务器端 - 当我使用默认的ubuntu telnet实现或putty时,接收非ASCII字符没有问题。我的代码看起来像这样(简化了一些可读性):

    TelnetClient telnetClient = new TelnetClient();
    telnetClient.connect("169.254.24.223", 23);

    while (true) {
        int readCharInt = telnetClient.getInputStream().read();
        if (readCharInt != -1) {
            String s = String.valueOf((char) readCharInt);
            System.out.print(s);
        } else {
            System.out.println("EOS");
            break;
        }
    }

我使用Wireshark仔细观察。使用Apache Telnet客户端时,数据包根本不包含非ASCII字符,并且在使用默认的Ubuntu Telnet时,它们确实包含它们: apache telnet 默认的ubuntu telnet

我一直想知道apache客户端是否在某种模式下转向服务器上的某种模式仅发送可以在7位编码的字符。我尝试了几种终端类型或次交二进制传输,但没有成功:

int[] msg = {TelnetCommand.DO,TelnetOption.BINARY};
telnetClient.sendSubnegotiation(msg);

I've been trying to useorg.apache.commons.net.telnet.TelnetClient and I am having trouble to receive non-ASCII characters (in my case polish chars like ą,ę,ć,ź and few others). The problem is not on server side - when I use default Ubuntu telnet implementation or Putty I have no problem receiving non-ASCII characters. My code looks something like this (simplified a bit for readability):

    TelnetClient telnetClient = new TelnetClient();
    telnetClient.connect("169.254.24.223", 23);

    while (true) {
        int readCharInt = telnetClient.getInputStream().read();
        if (readCharInt != -1) {
            String s = String.valueOf((char) readCharInt);
            System.out.print(s);
        } else {
            System.out.println("EOS");
            break;
        }
    }

I used Wireshark to take a closer look. When using the Apache telnet client, packets do not contain non-ASCII characters at all, and while using default Ubuntu telnet they do contain them:
Apache telnet
Default ubuntu telnet

I've been wondering if the Apache client turns on some mode for the server to send only characters that can be encoded on 7 bits. I've tried several terminal types or to subnegotiate binary transmission but without success:

int[] msg = {TelnetCommand.DO,TelnetOption.BINARY};
telnetClient.sendSubnegotiation(msg);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放我走吧 2025-02-07 19:43:11

我不确定为什么子谈判不起作用,但我找到了解决方法。

尝试将带有选项0(二进制)的SimpleOptionHandler添加到telnetConnection。这将导致此选项从一开始就可以启用。

TelnetClient tc = new TelnetClient();
// 1st param 0 means BINARY option
SimpleOptionHandler simpleOptionHandler = new SimpleOptionHandler(0, true, false, true, false);
tc.addOptionHandler(ttopt);

I'm not sure why sub negotiation does not work but I found a workaround.

Try to add SimpleOptionHandler with option 0 (BINARY) to TelnetConnection. It will cause that this option will be enabled from the start.

TelnetClient tc = new TelnetClient();
// 1st param 0 means BINARY option
SimpleOptionHandler simpleOptionHandler = new SimpleOptionHandler(0, true, false, true, false);
tc.addOptionHandler(ttopt);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文