我通过TcpClient.GetStream().ReadByte()
从telnet会话中获取字节数据流。然后我通过char
转换将此字节数据转换为ASCII。数据很好,但有很多额外的垃圾,如1[01;001H[0k[01.
任何人都知道这个额外的垃圾可能是什么?
UPDATE 下面有更详细的回复流
1 [01; 001H [0K [01; 017H [0; 1; 4mTitle of Page Here [0; 1m [0; 1m [02; 001H [02; 051H] [0KWed 3月28日,2012 03:03 pm [ 02; 051高速时间[0J [03; 001H [0J [23; 001H [0J [0; 1; 7mPrompt Here [P] - [0; 1m [23; 044H]
什么时候应该阅读
页面标题在这里 日期时间
提示
答案 0 :(得分:6)
您所看到的“垃圾”部分是Telnet协议的一部分。遥控器试图与你协商一些选项,也可能会发给你一些其他命令(虽然这在实践中相对较少)。有关所有可能命令的确切格式和含义,请参阅applicable RFC的TELNET COMMAND STRUCTURE
部分。
在大多数情况下,您将能够简单地忽略收到的任何Telnet命令(包括选项协商),但您必须对它们进行过滤:正如您所发现的那样,将Telnet会话视为干净的TCP流不会工作
除协议级选项外,遥控器还可以假设您是终端,并发送转义序列以确保数据正确显示。解释或过滤这些代码将取决于远程配置使用的终端类型 - 例如,您不会遇到VT100。
顺便说一下,没有必要深入研究规范:使用像minimalistic Telnet library这样的预先构建的东西来处理最重要的细节是完全可行的。
编辑,2012年3月29日:您看到的“垃圾”的其他示例确认遥控器将您视为VT100。例如:[0;1;4mTitle of Page Here
对应Set Attribute Mode: <ESC>[{attr1};...;{attrn}m
并尝试使页面标题显得明亮(1)并加下划线(4)。
这里最简单的选项:只要看到一个ESCape字符(ASCII 27),就在此之后忽略所有内容,包括不在列表[;0123456789
中的第一个字符。这将删除最常见的VT100代码:有一些可能需要特殊处理,但这些很少见,无论如何,你现在有规格。
但即使您剥离控制代码,您仍可能最终得到一个不可解析的数据流,尤其是在主机尝试维护精美的屏幕布局时。例如,它可以在您感兴趣的值流中间随机更新状态字段(例如时钟)。如果是这种情况,您将需要(虚拟)VT100仿真器附件屏幕刮刀。这些解决方案似乎主要涉及昂贵的商业软件,尽管libvt100 - A purely .net/C# library for parsing a VT100/ANSI stream可能适合您。