telnet网页版

今年年初的时候由于工作需要要写一个telnet网页版来模拟本地的telnet工具。

工具就是让服务器与要连接的机器,建立telnet连接。然后接收界面的数据,并在界面上显示出来。

后台的话随便找个开源的单机版的telnet工具改写一下,去掉界面部分,留下telnet连接和数据处理的部分就可以了。

相信任何一个有一个月以上java使用经验的人都会。

然后关键是在于如何将后台数据推送到前台。由于我对flex比较熟悉。所以前台用flex完成。

本来想用socket连接来完成的,但是出于安全原因。不能开放端口。于是我就使用blazeds的streaming-amf来实现。

但是我在本地实现了这个telnet网页版后,却发现上传到公司的服务器后无法使用。经过测试后发现是由于我本地的tomcat是6而公司用的tomcat7造成的。blazeds除了stream-amf其他的几个通道都能正常使用。我曾经试着用polling-amf来完成,但是这种靠轮询实现的返回速度实在是太慢了。后来又尝试用下载流来完成,发现速度也不理想而且还有其他一些bug。

最后陷入僵局了。这时领导终于开始松口了,可以使用socket来实现。这样问题一下子就迎刃而解了,但是有个奇怪的地方。有时我用socket交互的数据后面总是莫名奇妙的带上一些没用数据(就是原来发送过的数据)。所以我给每次发送数据的开头和结尾打上标记,每次解析出标记中间的数据(标记也会重复,但数据不会丢失,所以是可以靠这方法解决)。

在完成telnet网页版后,这时出现了一个功能需求,就是给telnet命令加上命令过滤功能。即指定哪台设备谁不能输入什么命令。

这太头疼了。因为telnet连接交互的只是字符串而已。等于是一台远程终端。根本无法区别命令和字符。

有人会说,你看telnet交互的时候,如果行首有#等命令提示符不就知道了吗?每次输完命令。在输入回车之前,如果不能输入,就将命令清空。但是这样忽略了一个问题。就是telnet的交互不是应答式的。你可能连着输入100条命令,可是那边还没有任何返回,然后一次性返回几百条数据。你按什么判断?有人会想到,给每次输入命令后加上一个等待时间,当数据返回后再放开输入如何。可是telnet交互不是应答式的啊,你输入一个命令,它可以不返回,也可以多次返回。你如何处理?

就这样又陷入了僵局,这段时间头疼的厉害。迫于无奈,只好写了一个将就的。

我建立一个表,然后对应不同设备的类型,来存储可能引发进入不是命令状态的命令,如果是命令状态就用正则表达式来比对是否是被限制的输入。

例如linux系统,命令状态下如输入vi命令,设置为进入viesc状态,(由于我用的是vt320,在进入viesc后不能直接编辑),在viesc状态下按s进入vi状态。

vi状态下按esc又返回到viesc状态,再输入Ctrol-z就退回到命令状态。

后来又要实现定时任务功能。

比如什么时候开始执行,执行间隔是多少。执行几次。结束时间是多少。例如还可能是星期2和星期3,或者15号和20号几点几分执行。

为了实现这个功能,我刚开始设计的是设计一条主线半分钟一次(因为任务只需要精确到分)来查询数据库中任务数据,放入到concurrentHashMap中;

然后另外根据配置数来开启对应数量的线程,来互斥的执行concurrentHashMap中的任务。一个任务开始后,移除concurrentHashMap中的这个任务

同时开启一条监听线程。监听还在执行中的telnet任务已经执行了的时间(有的任务会造成挂死),如果超过设置的超时时间,则终止这个任务。(关闭这个任务的socket连接(telnet连接的本质是socket连接),这个任务就结束了);

后来,我将其改写成用java自带并发包的ExecutorService来执行相关的任务。目的是防止自己控制线程的效率和安全问题。

原来我将每次任务执行的时间存放在缓存中,来计算任务每次执行的间隔,由于服务器经常重启。所以这个方法失败了,我只能将每次任务执行的时间存入数据库中。

还有一点改动的是,原来是每半分钟来查询一次数据库中的任务。我改成设定一个标志位,如果是第一次服务器启动,则从数据库中读取任务信息加载到静态map中,然后从这个静态的map中读取任务来提高速度。然后经过界面修改任务数据的时候,同时会将任务的改动存入数据库的同时同步到这个静态的map中,这样减少了对数据库的查询,提升了任务执行的效率。

这就是我这个菜鸟as程序员实现telnet网页版的方法,如有问题,请大家不吝指教。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页