文章摘要:
Terminal(终端)是基于Telnet协议的终端控制软件,全面支持Telnet客户端登录远程系统,同时也可以是专为BBS(电子公告栏)设计的客户端软件,能够自动判断用户在站上的环境状态,并可以提供很多工具加强对BBS的支持。
Term的提出:
大家都已经熟知了在Windows98及以前版本里面封装的Telnet客户端,该客户端不支持ansi色彩,和一些非标准的控制码,而这些在BBS里面是比较重要的,另一个最严重的问题是乱码出现率非常高,这无论是对远程控制服务器还是对BBS用户都是及其不方便的,另外,对于BBS用户,Windows的Telnet没有提供专门的BBS特性支持,虽然windows 2000的Telnet加入了对ansi色彩的支持,但是一些BBS里面非标准的控制码和一些符合BBS使用的功能仍然不够,所以Term的提出就显得很有必要了。
设计:
Term的核心是Telnet协议这里简要的介绍一下它的实现
1. 概述
(1).用户终端
Telnet协议定义了一个交互通信的工具,它允许用户与一个服务器进程进行通信。Telnet定义了一种交互的、面向字符的通信。协议说明了一个由键盘和显示屏组成的网络虚拟终端(NVT,network virtual terminal)。并且它制订了字符集,每当可客户机发送数据时,把它本机的终端字符表示映射到NVT的字符表上,当接收数据时又把NVT字符映射到本机字符上,是这样一种对称结构。
(2).控制命令
Telnet协议定义了一些命令字符串来表示当前应该采取什么操作,进入什么状态,并且经过特殊安排,使这些字符串能够从数据包里面分离出来
(3).对"并发性"的需要
Telnet在概念上说是客户机在用户终端和远程服务之间传送字符,它与用户终端交互时使用本机系统函数,它与远程服务通信时使用一个TCP连接。
为了在用户终端和远程服务之间提供全双工连接,Telnet客户机必须同时完成两个任务:
客户机必须读取用户在键盘上的输入,并且在TCP连接上把它们发送到远程服务
客户机必须从TCP连接的远程服务上读取字符,并显示在用户终端的屏幕上
因为上面两点很可能是同时的,所以就必须有一种并发性,在windows里面,我们可以利用消息机制来满足这种"并发"需求(并非真正意义上的并发)。
(4)Telnet的模型:
(5)协议主算法:
初始化Telnet类,将各缺省颜色属性,状态属性,系统设置里有关Telnet部分初始化.
在指明的远程主机地址上按用户指定的端口打开一个TCP连接.
阻塞直到用户键入或者数据从TCP连接上到达(通过消息机制,当用户键入时产生一个WM_KEYDOWN消息,当TCP连接上到达数据时,TclientSocket类会得到一个SeRead消息)
数据从用户到达(接收到一个WM_KEYDOWN消息),便将其处理并把它翻译成一个NVT表示,再将该NVT表示通过TCP传送出去;数据从TCP连接到达,则把它翻译成本机字符表示(可以使用的时ProcessChar过程,并且该过程的参数时一个字符),并显示在本机上.
返回第3步一直循环直到TCP连接断开。
2. 有限状态机FSM(Finite state machine)
大多数Telnet的实现采用有限状态机来说明命令序列的确切语法和对命令序列的解释。一方面,它确切说明了发送方如何在数据流里面嵌入命令序列,另一方面,也确切说明了接收到命令序列要如何解释它,所以有限状态机能够很好的实现Telnet协议。
有限状态机是指让当前终端的状态在有限的,已经定义好的状态里面不停循环,如何控制当前应该处于什么状态呢?那就是从服务器端传来的命令序列,
下面是一个有限状态机的示意图:
在一些Telnet里面使用了三个FSM有限状态机,一个控制键盘事件的响应,一个处理来自TCP连接上的字符,一个处理选项子协商细节,但由于这样将会使系统开销增大,所以一些程序里面使用压缩FSM矩阵表示,尽管如此,我还是没有考虑用这种机制,因为我们可以利用windows的消息机制来做到这一点,所以这里我推荐使用一个FSM有限状态机,其中融合了以上三个FSM(并非完全融合,其主体部分是处理来自TCP连接字符)。
3. 用户状态的智能判断实现
用户状态主要是指用户在BBS上的状态如上站,主菜单,环顾四方,讨论区列表,阅读文章……等等,那么我们如何来判断这些状态呢?
由于Telnet协议是面向字符的,所以这些字符也只能由字符特征来判断,
因为BBS站点没有提供专门的命令序列来表示这些状态,所以有站点不同而引起失效的可能。
4. 非标准的ESC控制码的实现
在BBS里面定义了一些非标准的ESC控制码,所以必须对这些控制码进行支持,其中的非标准控制码只要是闪烁、延时、字体变换
闪烁:(用5号命令来表示,如:*[1;5;32m是闪烁的绿色字符]
为了实现闪烁字符,我们可以采用一定时间刷新屏幕一次的办法,在刷新屏幕的同时,用一闪烁字符状态变量来控制什么时候改现实该字符,什么时候不应该显示字符(这里用的不显示字符是将背景和字符设置成同一种颜色),另外,系统设置里面用户可以自定义这个时间间隔.
延时:
延时是BBS里面弥补图形特别是动态图形的很好方法,利用延时可以制作出很多琳琅满目的动画效果.
延时的实现需要使用字符流模式的输出,当遇到延时控制码的时候,就可以用sleep来睡眠当前操作,其中sleep的参数是由控制码里面的参数带来的,如:*[1000M表示延时1秒钟,即1000毫秒。
字体变换:
字体变换是非标准ansi控制码,这个非标准完全可以在客户端实现,在BBS里面使用以下表示
*[1I 宋体 *[2I黑体 *[3I楷体 *[0I取消回缺省
5. 各种功能实现概述
首先,为确保功能的正常执行,需要智能的判断用户是否处于可以执行该功能的正确状态,这就是前面谈到的判断状态问题,以这个为前提,就可以更好的开发出这些功能。这些功能一些是利用自动发送键盘输入来实现,一些是自身集成一些控制码实现,当然消息管理器就完全是利用消息存储然后加密的方法
功能:
文章编辑器
信息输入条
文章阅读工具
文章下载工具
精华区操作工具
消息管理器
总结:
term设计的核心就是Telnet协议算法和ESC控制码以及附加功能的实现
(注:此文是本人于两年前所作,绝非来自他人的转贴)