- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在将“Telnet”接口(interface)从 C/C++ 转换到 Java 到我们在这里使用的某些模块时遇到问题。我希望能够与卡建立连接,在启动其命令行界面后,等待连接并向客户端提供提示(“OK>”)。这对于我编写的 C 和 C# 客户端都工作得很好,但 Java 给了我一些问题。我附上了一些从网上的一些示例中获取的代码,但到目前为止,我所能确定的是正在创建套接字。
代码:
private boolean CreateTelnetSession()
{
try
{
_socket = new Socket();
_socket.connect(new InetSocketAddress(_ipAddr, _ipPort));
_socket.setSoTimeout(10000);
_socket.setKeepAlive(true);
_out = new PrintWriter(_socket.getOutputStream(), true);
_in = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
_out.println("\r\n");
System.out.println(_in.readLine());
return true;
}
catch(Exception e)
{
System.out.println("Exception!");
}
return false;
}
套接字似乎已正确创建,当程序关闭时,我可以看到我试图与之交谈的卡上的 session 关闭,但我看不到回车/换行正如我所期望的那样在卡上回显,或者通过输入流返回提示。有没有可能是字符编码的问题?我是否对溪流做了一些错误的事情(穿过它们!?!)?有什么见解吗?当我克服了这个最初的学习曲线时,我想承认 Java 使这些套接字读写变得多么容易,但在那之前......
我读过这篇文章: java simple telnet client using sockets
看起来和我遇到的情况很相似,但又不一样。如果有人在这里看到可以解决我的问题的内容,我愿意接受代表的打击,所以请随时告诉我,坦率地,我错过了什么。
编辑:
private boolean CreateTelnetSession()
{
try
{
_socket = new Socket();
_socket.connect(new InetSocketAddress(_ipAddr, _ipPort));
_socket.setSoTimeout(10000);
_socket.setKeepAlive(true);
_out = new DataOutputStream(_socket.getOutputStream());
_in = new DataInputStream(_socket.getInputStream());
_outBuffer = ByteBuffer.allocate(2048);
_outBuffer.order(ByteOrder.LITTLE_ENDIAN);
_inBuffer = ByteBuffer.allocate(2048);
_inBuffer.order(ByteOrder.LITTLE_ENDIAN);
System.out.println("Connection Response: " + _in.read(_inBuffer.array()));
System.out.println("Response: " + WriteCommand("DRS\r\n"));
return true;
}
catch(Exception e)
{
System.out.println("Exception!");
}
return false;
}
private String WriteCommand(String command)
{
try
{
_outBuffer = encoder.encode(CharBuffer.wrap(command));
_out.write(_outBuffer.array());
_out.flush();
_in.read(_inBuffer.array());
String retString = decoder.decode(_inBuffer).toString();
return retString.substring(0, retString.indexOf('>') + 1);
}
catch(Exception e)
{
System.out.println("Exception!");
}
return "E1>";
}
有很多东西需要清理,我将尝试是否需要以这种方式进行清理,但这就是“解决方案”的要点。最大的 killer 是字节序。应该再次提到,这是丑陋的非生产代码,但任何其他输入仍然会受到赞赏。
最佳答案
我有几件事你可以尝试。您正在使用 PrintWriter 进行输出,这是一个相当高级的 Writer(即它封装了您的很多东西)。我担心的是 PrintWriter 中的 println() 方法会自动在末尾添加一个行终止字符(根据您的操作系统而定)。所以你真正发送的是“/r/n(line terminator)”,所以在unix机器上你会发送“/r/n/n”。
我建议切换到 DataOutputStream,它可以让您更好地控制发送的原始字节:http://docs.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html
请记住,如果切换到 DataOutputStream,则需要在输出流上调用刷新。
我的另一个想法是这可能是一个字节顺序问题。 Java 是严格的 Big Endian(网络字节顺序)。您的“卡”是否有可能以小端方式读取内容?如果您需要以小端在网络上写入(如果是这样,您的卡是一个坏网民!)您将需要使用 ByteBuffer,将其顺序设置为小端。将字节写入其中,然后将字节从 ByteBuffer 写入 DataOutputStream。
我可能也会为您的输入流切换到 DataInputStream。 readline() 仅在看到换行符后才会返回。您的卡是否在响应中返回换行符?
我最后的想法是,您的 println 方法可能有错误,但您不知道,因为 PrintWriter 不会抛出异常。 PrintWriter JavaDocs 说:
“此类中的方法永远不会抛出 I/O 异常,尽管它的某些构造函数可能会抛出 I/O 异常。客户端可以通过调用 checkError() 来查询是否发生了任何错误。”
希望我冗长的回复中的内容能够对您有所帮助。
关于java - Java "Telnet"代码中的套接字流有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823696/
我一直在尝试创建一个 expect 脚本来通过 telnet 自动登录到我的设备 如果expect 命令没有多种可能性,则脚本可以正常工作,登录设备。 #!/usr/bin/expect set ti
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
据我了解,Telnet 与 HTTP 一样都是一种协议(protocol)。我有这样的想法,在建立初始 TCP 连接后,Telnet 客户端会将一些 telnet 特定代码发送到另一端的服务器(在本例
我正在尝试使用 C++ 和 QT 作为 GUI 来实现 Telnet 客户端。我不知道如何处理 telnet 协商。每个 telnet 命令都以 IAC 开头,例如 IAC WILL SUPPRESS
我需要在 telnet 中进行大量测试。我正在研究一些方法来自动检测我们电子邮件服务器上的字典攻击,然后限制它们,或将它们列入黑名单等。 我现在准备运行一些测试,看看我的工作是否有返回。我想我只需下载
看来您应该能够使用 telnet 手动进行 json-rpc 调用。但是,当我尝试这样做时,服务器根本没有任何响应,我不得不关闭 telnet 客户端。我是否需要发送 header 和/或以某种方式表
看来您应该能够使用 telnet 手动进行 json-rpc 调用。但是,当我尝试这样做时,服务器根本没有任何响应,我不得不关闭 telnet 客户端。我是否需要发送 header 和/或以某种方式表
我正在使用来自 busy-box 的 Telnet 客户端。我需要与 telnet 服务器创建一个 session ,但需要根据特定条件从 C 代码创建 session ,一旦创建 session ,
我需要发出 telnet close 命令,通常,^] (Ctrl-]) 应该可以工作。(找不到任何 emacs 特定的 telnet 文档) 我怎样才能得到 telnet>当我在 emacs 中使用
几天前我买了一个新的 MTS Wi-Fi Dongle,今天在使用它时,我使用我的 Android 设备在 192.168.1.1 上进行了端口扫描,令人惊讶的是端口 23(telnet)是开放的。输
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有一个项目要做,它是这样的: 当您打开一个 telnet 控制台并 telnet 到我的服务器时,PHP 应该响应:“你好,你叫什么名字?” 然后你输入你的名字等等。我怎样才能在 PHP 中做到这一
是否可以通过 telnet 连接到服务器并从那里 telnet 到 python 中的另一台服务器?由于有一个 Controller ,我使用用户名和密码远程登录,并且从 Controller 命令行
我选择了一个用 C 编写 Telnet 服务器和 Telnet 客户端代码的项目。我正在学习 C 编程。 有没有人尝试过这个。请告诉我如何进行以及要引用的 Material 。抱歉询问源代码。我不知道
我需要编写一个在 Windows 上运行的 Perl 脚本,以通过远程登录到 Linux 机器来不断监视 Linux 机器下的日志文件以寻找模式。但问题是,Linux 机器非常频繁地重新启动(通过一些
我是 python 新手,我正在编写一个脚本来在某些情况下“telenet”设备 IP,如果 telnet 失败则编写 SSH username@deviceIp.. 对于所有 Telnet IP,它
我正在使用 org.apache.commons.net.telnet 库与我的 Telnet 服务器建立连接,该服务器的实现与标准 RFC 854 略有不同,但没什么太可怕的。 实际上,我建立到此远
我正在使用 org.apache.commons.net.telnet 库与我的 Telnet 服务器建立连接,该服务器的实现与标准 RFC 854 略有不同,但没什么太可怕的。 实际上,我建立到此远
我的要求是从 Node js连接到Telnet客户端。 我正在使用 telnet-client包裹 我正在使用此代码进行连接 var Telnet = require('telnet-client')
我需要一个 expect 脚本来等待发出的命令完成,然后从 telnet 注销。这是脚本: spawn telnet host send "username\r" send "password\r"
我是一名优秀的程序员,十分优秀!