我有一台实现Telnet服务器的设备,并且正在编写Java代码与之通信。当前的实现“有效”,我的意思是它将挂起一段时间,有时会立即挂起,有时在一小时后或介于两者之间的任何时间挂起。我没有排除它本身就是设备本身的可能性,但是,使用腻子长时间运行的会话似乎没有问题,因此我假设它是我的Java代码。
我将首先布置代码,然后更详细地描述问题:
该连接由一个对象处理,该对象在后台EthernetTelnetConnection()
使用Apache Commons TelnetClient()
。
public EthernetTelnetConnection(String host, int port) throws IOException {
mTelnet = new TelnetClient();
mTelnet.connect(host, port);
mOut = mTelnet.getOutputStream();
mIn = mTelnet.getInputStream();
}
这些流通过以下方式转换为缓冲流:
mReadStream = new BufferedInputStream(mConnection.getInputStream());
mWriteStream = new BufferedOutputStream(mConnection.getOutputStream());
可以通过以下方式获取:
public BufferedInputStream getInputStream() {
return mReadStream;
}
public BufferedOutputStream getOutputStream() {
return mWriteStream;
}
因此,在创建连接后,我开始尝试解析流。这发生在专用线程中,该线程的唯一目的是执行该方法:
public void detectMessages() throws IOException {
final BufferedInputStream in = mTekdaqc.getInputStream();
StringBuilder builder = new StringBuilder();
int data;
final Scanner scan = new Scanner(in, "UTF-8").useDelimiter(Character.toString((char) AASCIIMessage.RECORD_SEPARATOR_CHAR));
while (scan.hasNext()) {
onMessageDetected(scan.next());
}
/*while ((data = in.read()) != -1) {
if (data == AASCIIMessage.RECORD_SEPARATOR_CHAR) {
onMessageDetected(builder.toString());
builder = new StringBuilder();
} else {
builder.append((char) data);
}
}*/
}
并且AASCIIMessage.RECORD_SEPARATOR_CHAR
定义为:
public static final int RECORD_SEPARATOR_CHAR = 0x1E;
底部的注释部分有一些其他变量,这是我以前的尝试。两种方法都存在相同的问题,即:onMessageDetected()
最终以成千上万个空字符串被调用。通常,如果我让事情继续运行,最终事情会像往常一样持续一会儿,那么这个问题就会再次出现。因此,我试图找出是什么原因导致扫描程序和简单的while循环/读取周期检测消息分隔符。当捕获设备与腻子之间的有线通讯时,我可以确认它没有发送这些分隔符,尽管它正在发送保持活动的数据包。
更新
我认为这可能是一个问题,其中Apache TelnetClient将字节序列解释为终端命令,而Putty则不然。我不确定该设备实现的终端实现方式,因为我没有创建该代码,也未对其进行记录。我看了一下腻子,它没有在Telnet配置窗口中指示终端类型。
更新2
我连接System.out
到TelnetClient
实例的间谍流,并在十六进制编辑器中检查了输出,发现该流实际上正在看到重复的RS (0x1E)
字符。用Putty Telnet连接嗅探流量我看不到这一点,那么是否存在某种与TelnetClient
类和设备不正确的配置?
因此,事实证明我可以将此归咎于设备。当我嗅探到腻子的流量并执行与Java应用程序完全相同的命令序列时,我能够重现该问题。我需要在固件中进行追踪,这是一个错误。感谢@Adam和@MrunalGosar的输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句