Windows Mobile Telnet客户端(译文)
By S.F.
本文链接 https://www.kyfws.com/news/windows-mobile-telnet-client/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 7 分钟阅读 - 3314 个词 阅读量 0Windows Mobile Telnet客户端(译文)
原文地址:https://www.codeproject.com/Articles/19877/Windows-Mobile-Telnet-Client
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
Windows Mobile 5设备的Telnet客户端的实现.
介绍
今天,我看到telnet主要用作HTTP,SMTP和其他协议的诊断工具.我经常自己使用它来诊断服务器问题.最近,我发现我的手机是使用telnet进行这些目的的理想设备,因为它可以轻松连接到本地网络进行测试,并且可以使用其唯一的Internet连接从本地网络之外的某个点连接到服务器. . 使用C#和.NET Compact Framework,在不到一天的时间内即可快速轻松地编写客户端.在本文档中,我将重点介绍创建客户端的最重要部分.
先决条件
编写此应用程序时,我已将Windows Mobile 5 Professional设备作为目标.我已经在HTC向导(品牌为Cingular 8125)和iPaq 4705上测试了该程序.我试图在Motorola Q上运行该程序,但是无法跟踪发生的与线程相关的异常(不幸的是,该异常也会导致Visual Studio关闭).因此,到目前为止,我相信该程序将无法在没有触摸屏的设备上运行.要运行此程序,您的设备必须具有2.0 Compact Framework.如果未安装,则允许Visual Studio调试Windows Mobile 5设备上的程序时,Visual Studio会将框架安装到您的设备上. 该UI旨在能够在分辨率为240x240的设备上显示,但实际上应该在分辨率至少为320x240的设备上运行.理想情况下,如果使用部分实现的终端仿真器功能,则应在VGA分辨率设备上运行.
并非所有设备均相等
.NET允许该程序在多种类型的设备上运行.不幸的是,我发现并非所有运行该框架的设备都支持.NET 2.0框架的所有功能.当您使用不受支持的功能时,IDE不会产生错误(并且我实在无法期望它会因为它不知道将在其上运行的所有设备的所有功能)而使错误变得更加复杂. 无法在所有设备上使用的功能的一个示例是ToolBar控件.此控件在桌面和Windows Mobile 5 Professional设备上可以正常显示,但会在Moto Q上导致" UInsupportedException".我还发现"保存文件对话框"在两个平台上均不可用.
建立连接
建立telnet会话的所有代码都可以在TelnetSession类中找到.该类中感兴趣的主要对象是Socket类和NetworkStream类的实例.套接字的创建是通过CreateSocket
方法完成的.此方法将目标计算机的地址或主机名以及要使用的远程端口号作为其参数.该方法解析目标计算机的IP地址,并尝试与其建立连接.如果成功,将返回创建的套接字.
Socket CreateSocket(string machineAddress, int port)
{
//Resolve the IP address(es) of the target machine
IPHostEntry iphostEntry = null;
iphostEntry = Dns.GetHostEntry(machineAddress);
//let's go through the list of IP addresses returned and attempt
//to connect to each one. once a successful connection is made
//return the socket created from that connection and stop testing
//on any remaining ports. If no connection can be established then
//return null
foreach (IPAddress address in iphostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address.Address, port);
Socket tempSocket = new Socket
(ipe.AddressFamily,SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if (tempSocket.Connected)
{
return tempSocket;
}
}
return null;
}
创建套接字后,将在其周围包裹一个NetworkStream对象,以便为套接字提供一个流接口.然后创建一个StreamReader和StreamWriter,它们引用网络流并为我们提供一种与连接进行交互的自然方式.
读写数据
将数据写入连接非常简单.在StreamWrite
r对象上使用Write
方法在流上发送字节数组.
public void Send(byte[] message)
{
_writerStream.Write(message);
_writerStream.Flush();
}
阅读涉及更多.尽管可以调用StreamReader.Read
方法,但这是不可取的,因为它将阻塞线程,直到读取缓冲区已满.如果服务器返回少量字节,则即使没有字节,程序也可能会等待更多字节.由于连接的异步性质,我们不知道将要接收多少字节以及何时接收.
为了解决不知道何时接收数据的问题,创建了一个新线程,该线程将等待接收数据并在数据可用时触发事件.在线程内,检查NetworkStream对象的DataAvailable属性.如果没有可用数据,则线程将休眠一会儿.如果有数据,则立即读取并转换为"字符串".这个"字符串"被添加到队列中,然后" TelnetSession"对象通过" BlockReceived"事件发送一个通知,以通知订阅者该数据可用.通过ReadBlock
方法读取生成的string
.注意,ReadBlock
返回任意数量的文本行.
发生这种情况的线程被标记为后台线程.这有助于确保在应用程序的主线程终止时线程将终止.否则,将存在用户关闭程序但程序继续运行的风险.
向用户显示信息
该程序支持两种向用户显示信息的方式.第一种(也是最简单的方法)是将接收到的"字符串"直接写入"文本框".由于Windows Mobile设备的内存可能较少,因此随着向"文本框"中添加更多信息,因此会从"文本框"的开头删除文本以限制其大小.对于大多数telnet会话,这将是一种足够的显示技术. 显示数据的第二种方式涉及程序中名为TelnetTerminal的类.此类模拟具有固定宽度和高度的显示终端的行为.我已经将终端设置为80列的宽度和25行的高度(可以通过对象构造函数更改这些尺寸).终端可以识别某些转义序列,以使光标在其内部移动并清除屏幕.虽然TerminalEmulator类是受Ecma 48启发的,但这绝不是完整的实现.该终端在很大程度上是实验性的,但是留给了程序中希望扩展其功能的任何人. " TerminalEmulator"将在支持VGA的Windows Mobile设备上最佳工作.
输入并保存连接信息
连接信息通过" ConnectionSettings"表单输入.该表格要求输入要连接的计算机的名称,要使用的端口,是否将缓冲输入内容以及其他一些内容.此信息的详细信息如下所示:
- 文本框 可以通过菜单序列File-> New Connection访问该表格.创建新连接时,将使用有关当前连接的信息来填充每个字段的默认值.保存的连接信息被序列化为XML文件,因此您也可以使用文本编辑器轻松更改连接信息.
运营商限制
在测试该程序时,我确实发现,使用某些电话运营商时,无法打开某些端口上的连接.请务必注意,运营商可能不允许所有端口.
三种调试方式
有三种方法可以调试此程序.建议的方法是将Windows Mobile 5设备连接到计算机,然后按F5键开始部署和运行应用程序.屏幕上将提示您选择目标设备.标记为" Windows Mobile 5.0 Pocket PC设备"的第一个选项将在必要时将该程序复制到您的设备和.NET Compact Framework中.第二种方法是从部署程序时选择一个仿真器.
第三种测试方法是在工作站上运行程序,然后从Visual Studio中将其附加到该程序.为此,请编译程序,然后导航到最终二进制文件的存储位置.运行它,然后在Visual Studio中,选择菜单序列Debug-> Attach to Process.然后,您可以选择J2i.Net.Telnet.exe作为要附加和调试的过程.
调试HTTP请求
最简单的调试连接是HTTP请求.为此,请创建一个新连接并指定一个Web服务器名称作为地址(例如www.microsoft.com),为端口输入80,然后选择字符缓冲区终端类型.选择"确定"后,会话将开始.输入GET/
,然后按两次返回键.您应该收到服务器将为其根页面提供的原始响应.
结论和未来特征
我相信,以目前的形式,该程序可以用作诊断工具.稍后,我可能决定增加记录通过会话发送的信息的功能,或者如果我发现需要或要求它,则可以进一步实现终端仿真器功能.我计划进一步研究阻止该应用程序在Motorola Q上运行的原因.我还可能添加用户界面以允许自定义终端的属性(例如文本颜色).
历史
- 日
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
VS2005 C#2.0 WinMobile5 C# Windows WinMobile .NETCF .NET Visual-Studio Dev Intermediate 新闻 翻译