文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院网络编程J2EE/J2MEMIDP终端模拟之二:高级终端模拟
精品推荐
特别推荐
·J2EE Web开发技术期待一次新的技术变革
·J2ME程序开发初学者快速入门的九大要点
·使用技巧:J2ME中程序优化的十个小方法
·RMS从入门到精通之一
·J2EE应用程序中SQL语句的自动构造方法
·解决J2EE系统应用性能问题常用优化项目
·J2EE实用技巧:提升JSP应用程序的绝招
·J2ME内存优
·J2ME简介
·J2EE技术
热点TOP10
·FC API(JSR 75)简单讲解
·J2ME程序开发初学者快速入门的九大要点
·游戏框架之心得体会(1)
·在J2EE中APPLET和HTML作为客户端的比较
·Eclipse入门?使用指南及开发Eclipse插件
·jboss配置系列第一天
·一个2D图形绘画的案例
·类似卫星扫描效果
·扫描屏幕和颜色渐变的效果
·一个基于MIDP的迷宫游戏

MIDP终端模拟之二:高级终端模拟

日期:2008年7月19日 作者: 查看:[大字体 中字体 小字体]


下载 项目源代码

在本系列的第一篇文章中,我们构建了一个简单的可在任何支持 TCP/IP 插槽的 MIDP 设备上运行的终端模拟器。它包含一个实现 Telnet 协议的 Connection 和一个经过定制来显示终端内容的 Canvas。在第二篇文章中,我假定您已经阅读了第一篇文章并熟悉了这些组件。

MIDP终端模拟之二:高级终端模拟(图一)现在我们将进一步加强这个应用程序。首先,我们将通过添加一个更高级的终端类型来增加一些复杂性。然后我们将添加对用户输入的支持——注意大多数移动设备的各种限制。完成后,我们就能够使用这个应用程序来通过 Telnet 连接到远程服务器并运行许多种类的程序,而这一切都是从您的 MIDP 设备来进行的。

关于 ANSI 终端

在上一篇文章中我们实现了一个“哑巴”终端。它显示的仅仅是一个字符流,当进入的字符到达屏幕的边缘时就换行到下一行,在遇到一个换行符时就跳到下一行。虽然这种程度的交互性对于整代的命令行应用程序是足够的,但较复杂的软件则将屏幕作为一个整体来处理,这就需要编写和清除特定位置的字符以提供更好的用户体验。

这里有一段有趣的历史。在 20 世纪 70 年代,众多生产视频终端的厂商提供的屏幕操纵功能专有且各不相同,并以不兼容的方式来实现。要编写可利用多种这样的设备的面向屏幕的软件就很困难。

American National Standards Institute (ANSI) 参与进来。坚持其通过可互操作性来支持商业的要求,ANSI  介入并发布了标准 X3.64:Additional Controls for Use with American National Standard Code for Information Interchange。这个文件定义了现在所知的 ANSI 终端类型。它对将光标移动到屏幕上的特定位置、在光标位置插入和删除字符都规定了标准的命令序列。

最为重要的是命令序列定义自身,因为即使是未实现所有命令的终端也至少能够将不支持的命令识别为命令,并安全地忽视它们。这一进步使得软件开发商可以按照通用标准来编写,并确信他们的应用程序能够至少占用较小的容量来在很多厂商的设备上运行。ANSI 的故事是软件行业一个重复出现的主题的一个很好的例子:采用一种标准会极大地扩展可互操作性。

ANSI 终端标准是一种很像 Telnet 协议的协议。它定义了多个特殊的字符序列,使一个应用程序可区分要解释的命令和要显示到屏幕的数据。

ANSI 终端是我们将要模拟的终端类型。TelnetConnection 已经在其到达屏幕之前过滤出 Telnet 握手和协商;现在我们将增加另一个过滤器来过滤出并解释 ANSI 命令。因为这些命令是我们的终端的指令,实现该逻辑的最好的地方就是在 TelnetCanvas 类自身中。

终端转义序列如何工作?

当 Telnet 使用字节值 255 来以信号方式表示一个命令序列时,ANSI 使用 ASCII 转义序列,其值是 27。ANSI 将如下工作:

我们从输入读取一个字节。如果其值不是 27 (ESC),则它不是一个命令∶我们将它直接送到应用程序并继续读取。

我们读取下一个字节。如果其值不是 133 ([),则它不是一个命令;我们将该字节后所跟的 27 直接送到应用程序并继续读取。

我们将继续读取,直到读取到大于 63 的一个字节。这些字节形成一个字符串,其中含有命令的参数。最后一个字节(是 64 或更大)是命令代码。我们处理(或忽略)该命令并继续读取。

许多命令从官方来讲是标准的一部分。虽然完全模拟是一个值得的目标,我们仍将精力放在获得足够的功能来使众多软件可以接受地运行。我们将实现以下命令:

Cursor Control Sequences Erase Sequences A Move cursor up n lines @ Insert n blank spaces B Move cursor down n lines J Erase display: after cursor (n=0), before cursor (n=1), or entirely (n=2). C Move cursor forward n spaces D Move cursor backward n spaces K Erase line: after cursor (n=0), before cursor (n=1), or entirely (n=2). G Move cursor to column x H Move cursor to column x, row y L Insert n new blank lines d Move cursor to row y M Delete n lines from cursor s Save current cursor position P Delete n characters from cursor u Return to saved cursor position  

大多数这些命令期望参数采用分号分割字符串的形式。参数出现在序列 ESC [ 后和命令字节前。例如,一条用于将光标移动到第 10 行和第 10 列的命令将如下所示:ESC [ 1 0 ; 1 0 H。许多命令只带一个参数;例如,ESC [ 2 J 将清除屏幕显示。漏掉的参数将默认为 1,所以 ESC [ H 将把光标返回到坐标 (1,1),而 ESC [ B 则将光标移动到下一行。

虽让有很多的东西要处理,但协议却相当简单。

增强 Telnet Canvas 类

我们需要在两个领域中更新 TelnetCanvas。它需要解释从远程主机接收的 ANSI 命令并发送 ANSI 命令来响应用户输入。对于输入,我们将允许用户使用设备上的键盘来移动光标。

实现 ANSI

虽然我们必须修改 TelnetCanvas 类的内部,但却没有必要更改公共接口。所有数据将仍由 receive() 方法来接收。我们只更改其实现来监视转义序列:

/**
* Appends the specified ascii byte to the output.
*/
public void receive( byte b )
{
    // ignore nulls
    if ( b == 0 ) return; 
    if ( state == PARAMS_STATE )
    {
        // if still receiving parameters
        if ( b < 64 )
        {
            argbuf[0]++;
            
            // grow if needed
            if ( argbuf[0] == argbuf.length )
            {
                char[] tmp = new char[ argbuf.length * 2 ];
                System.arraycopy( 
                    argbuf, 0, tmp, 0, argbuf.length );
                argbuf = tmp; 
            }
            
            argbuf[ argbuf[0] ] = (char) b;
        }
        else // final byte: process the command
        {
            processCommand( b );
            // reset for next command
            argbuf[0] = 0;
            state = NORMAL_STATE;
        }
    }
    else
    if ( state == ESCAPE_STATE )
    {
        // if a valid escape sequence
        if ( b == '[' )
        {
            state = PARAMS_STATE;
        }
        else // not an escape sequence
        { 
            // allow escape to pass through
            state = NORMAL_STATE;
            processData( (byte) 27 );
            processData( b );
        }
    }
    else // NORMAL_STATE
    {
        if ( b == 27 )
        {
            state = ESCAPE_STATE;
        }
        else
        {
            processData( b );
        }
    }
}



[1] [2] [3] [4] [5] 下一页 




上一篇:MIDP终端模拟之三:MIDP 的自定义字体

下一篇:MIDP终端模拟之一:一个简单的模拟器MIDlet

相关文章:
·模拟城市4秘籍
·07年4月计算机三级网络技术考前模拟一
·模拟城市4-心得汇总 - 游戏攻略
·Telnet高级入侵攻略及原理
·电脑自动关闭文字高级服务
·申报中学高级教师个人述职报告
·斗地主两副牌“门板”高级篇
·XP系统模拟Vista视觉效果全攻略(3)
·Telnet高级入侵攻略
·模拟键盘按键 自动输入文字
相关软件:
·模拟城市3000(Sim City 3000)简体中文版
·NDS《逆转裁判4 完美汉化简体中文版》模拟器
·法律法规全库 高级版
·整形模拟软件_非常face V1.0
·《flash制作高级教程》
·《铁拳5》模拟器
·模拟人生 2
·高级计算机网络
·《拳皇97》加强版 风云再起 模拟器
·玄异怪谭系列丛书之二

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot