Android平台下的TCP客户机教学设计

2018-11-16 09:35马玉春乔丽娟汪文彬
软件 2018年10期
关键词:校验码客户机主线

马玉春,刘 雍,乔丽娟,汪文彬



Android平台下的TCP客户机教学设计

马玉春,刘 雍*,乔丽娟,汪文彬

(海南热带海洋学院海南省嵌入式系统重点实验室,海南 三亚 572022)

移动互联网正进入高速普及期,成功的产品和服务模式不断向其他产业领域延伸渗透,其中最重要的技术之一就是数据的传输与处理。本文在Android平台下对TCP通信任务进行分解,结合多线程技术、消息处理、数据编码与校验技术剖析了一个通用多功能TCP客户机测试软件的实现过程,从而达到较好的教学效果。

Android;TCP客户机;多线程;消息;编码;校验

0 引言

移动互联网广泛应用于众多领域,作为具体表现形式,可以用Android手机作为TCP客户机监测远程对象的状态或进行远程控制。TCP客户机需要跟TCP服务器建立连接,然后在后台接收数据,这涉及多线程的处理,另外对于一些耗时的工作,也必须采用多线程技术,否则容易导致APP崩溃。主线程与TCP客户机中运行的线程不在同一个空间,客户机收到的数据不能直接发送到主线程供分析和处理,必须通过消息机制作为中介来完成此项工作。对于POP3协议,采用的是带回车换行作为结尾码的文本类型的协议;而对于远程控制,则经常采用带校验码与结尾码的字节型协议[1]。本文创建一个通用的TCP类,结合消息机制和多线程技术,既可以用来开发TCP客户机应用,又可以用来开发TCP服务器应用;TCP类与数据的编码与校验相结合,完成一个通用TCP客户机软件工具,可以完成多项工作,具体功能将在软件测试方面进行展开,其工作模型如图1所示。

图1 TCP客户机工作模型

1 消息机制

消息处理类Handler允许发送和处理Message或Runnable对象到其所在线程的消息队列中,每个Handler类的实例都与一个线程及其消息队列相联系,当创建一个Handler实例时,这个实例就绑定到创建该实例的线程和消息队列中。Handler类采用post方法将Runnable对象发送到所在线程的消息队列中排队执行,可以立即发送,也可以延迟发送,延迟的时间单位为毫秒。Handler类通过send­Message方法将消息发送到所在线程,可以立即发送(空)消息,也可以延迟发送(空)消息,消息中含有需要传递到主线程中的数据以及消息识别代码。Handler的handleMessage是一个自动回调方法,需要根据实际功能重写,图1中TCP客户机在主线程的handleMessage方法中处理TCP客户机类的对象所收到的数据[2]。

尽管Message类有默认的构造方法,但通常采用Handler对象的obtainMessage方法来获得并初始化一个Message对象,指定表1所示的参数,其中what用来标识消息,如果需要向主线程传递整型变量,直接设置arg1和arg2的值;如果不需要,缺省设置为0即可。obj是Object类型,也就是通用类型,可以是任何类型的数据,但不能是基类型,因而,字节数组必须转换成ByteBuffer类型的对象。

表1 Message类的常用属性

Tab.1 Common attributes of message class

在教学设计上,可以安排一个简单的时钟软件项目,用Handler对象每过1秒钟发送一个空消息,在主线程的handleMessage方法中更新用户界面中的时钟信息。也可以安排一个监控手机返回键的软件项目,避免不小心按下返回键即退出应用软件。当第一次按下返回键时,过两秒复位返回键,否则,在两秒之内第二次按下返回键即退出当前软件。这两个软件项目都比较简单,而且可以用来较好地理解消息机制[3]。

2 多线程技术

在Android系统中,所有的操作默认情况下都是在主线程中进行,对于一些比较耗时的操作或者需要并行完成的操作,通常使用一个独立的线程来执行。获取IP地址是一个耗时的工作,需要使用多线程,并在其中使用上一节的消息机制将IP地址提交到主线程。

这里以获取Wi-Fi的IP地址为例。在多线程对象中调用getSystemService方法传入系统参数从而获得WifiManager对象,然后调用该对象的getConnectionInfo方法获取连接信息,从而进一步调用getIpAddress方法获取int类型的IP地址,可以将此IP地址转换为文本形式的格式化IP地址。在主线程中通过Thread对象的start方法启动该多线程,在其中启用Handler对象的消息机制,将文本形式的IP地址传送到主线程进行显示[4]。

在教学设计上,可以安排一个用于获取IP地址的多线程软件项目,在主线程启动多线程获取IP地址,通过handleMessage回调方法在主线程中获取IP地址信息并显示。如果不使用多线程技术,则软件将直接崩溃。该项目逻辑简单,但是,能够较好地说明多线程的作用。

3 TCP类

文献[5]设计了一个TCP服务器类,并在此基础之上构建了一个TCP服务器软件。TCP客户机与TCP服务器有相似之处,都要建立连接,连接成功后即采用多线程技术在后台读取收到的数据,然后通过消息机制将收到的数据提交到主线程。TCP通信具有普遍性,这里创建一个Library共享类库项目,在其中创建一个TcpClientServer类,使其既支持TCP客户机,又支持TCP服务器。

表2 TcpClientServer类中的自定义消息

Tab.2 Custom messages in the TcpClientServer class

TcpClientServer类中所定义的消息如表2所示,无论是工作在客户机或服务器模式,如果软件收到"Interval?! ",则立即返回"OK! ",同时向主线程发送消息MSG_ReplyOK,该方法从接收数据到返回数据,中间没有耽误任何时间,因而,可以用来测试客户机与服务器之间的时间距离,为软件研发提供参数设置支持。其他为常规消息,主线程收到MSG_Connected消息,可以进入发送数据环节;收到MSG_Closed消息即可释放资源;收到MSG_ DataArrived消息,即可提取表1所示的obj数据,利用下一节的编码与校验技术对数据进行检查,如果正确再执行相关操作。

在TcpClientServer类中设置两个构造函数,都设置Handler参数,用于进行消息传递。两个构造函数不同部分是,如果仅设置端口地址,则TcpClie­ntServer类作为TCP服务器使用;如果设置了主机名称(或IP地址)和端口地址,则TcpClient­Server类作为TCP客户机使用。在服务器工作模式下,初始化ServerSocket类时传入端口地址,得到Server­Socket对象,再调用accept方法,客户机与服务器连接成功,即可得到Socket对象;在客户机工作模式下,直接初始化Socket类得到其实例,然后调用其connect方法,传入远程主机名称、端口地址以及连接延迟三个参数,即可与远程服务器建立连接[6]。本文研发的通用客户机测试软件采用后一种工作模式。

得到Socket类的实例后,如果采用文本协议进行TCP通信,则调用其getInputStream方法得到输入流对象,然后依次获得InputStreamReader和Buff­eredReader对象,最后启动多线程通过Buffered­Re­ader对象在后台读取文本数据,通过MSG_Data­­Arrived消息将收到的数据提交到主线程。相应地,通过Socket类的实例的getOutputStream方法得到输出流对象,然后依次获得Output­Stream­Writer和Bu­fferedWriter对象,这样,主线程即可通过Bu­fferedWriter对象发送文本数据。如果采用字节协议进行TCP通信,则采用BufferedInput­Stream对象在后台读取字节数据,主线程则通过BufferedOut­putStream对象发送字节数据。

在教学设计上,先实现客户机工作模式,与POP3服务器连接后,实现文本数据的接收与发送,再进一步过渡到字节数据的接收与发送。对应地,接着实现服务器工作模式,跟完成的客户机软件建立连接,分别实现文本数据的接收与发送,再实现字节数据的接收与发送。当客户机软件和服务器软件都实现以后,将TCP客户机类与服务器类综合为一个类,即TcpClientServer,这样可以方便代码的维护。

4 编码与校验

TcpClientServer类既可以收发文本数据,也可收发字节数据。对于一个字节,有多种不同表达方式,分别用于不同的场景,如表3所示(普通字符列的“-”表示不可见字符)。如果某设备采用字节型协议,为了对该设备进行测试,则需要将收到的数据转换为16进制字符串形式;而字节数据也可以用16进制字符串来表示,因为字符串方便进行连接,在需要发送的时候,再转换为字节数据;如果客户机与服务器之间采用文本协议,则直接采用“普通字符”即可。

表3 字节的不同表示方法

Tab.3 Different representations of bytes

为了适应各种数据的传输,在Library类库项目中创建ByteProcess类,用bytesToHexChars静态函数实现字节数组到16进制字符串的转换,用hexCharsToBytes静态函数实现16进制字符串到字节数组的转换;用enStringToBytes静态函数实现普通字符串到字节数组的转换,通过bytesToEnString静态函数实现字节数组到普通字符串的转换;用enStringToHexChars静态函数实现普通字符到16进制字符串的转换,通过hexCharsToEnString静态函数实现16进制字符串到普通字符串的转换。

编码只是解决了数据传输的形式,而不能保证数据传输的正确性,因而,需要对传输的数据进行校验。TCP/IP协议采用累加求补方式,即对于需要发送的字节数组,累加所有字(即每两个字节作为一个字),然后将结果的低位字与高位字相加,最后将结果取反并取低位字,此即累加求补校验码[2]。计算所得的校验码一般放在需要发送的数据后面,对方收到数据后,重新计算校验码,如果收到的校验码和计算所得校验码相等,则说明收到的数据正确,就进一步处理,否则直接丢弃。累加求补校验码有其特殊性,对包含累加求补校验码的数据包进行验证,只要整体校验码计算结果为0,即说明数据正确。相似地,异或校验码和循环冗余校验码也有此特性。

累加和校验码只需要将待发送的字节进行累加取低字节,异或校验码只需要将待发送的字节逐个异或。循环冗余(CRC)校验码的算法比较复杂,其基本思想是将需要发送的数据包当作一个系数为0或1的多项式。多项式的算术运算采用代数域的理论规则,以2为模进行,即加法没有进位,减法没有借位,加法与减法都等同于异或。长除法与二进制中的长除运算类似,只是减法按照模2进行[7]。在Library类库项目中,添加Parity类,分别实现以上各种校验码的计算及数据包的校验。

在编码与校验的教学设计上,设置断点比较高效,采用“Debug As”模式跟踪数据的变化,逐个完成数据编码转换函数及校验码的计算过程。POP3之类的应用层协议需要添加回车换行符作为结尾码,有的设备需要使用回车符作为结尾码[8]。结尾码的添加与检验比较简单,这里不再赘述。

5 软件测试

新建TcpClient项目,引用以上Library共享类库,依次导入TcpClientServer类、ByteProcess类和Parity类,设计好软件界面,即可快速搭建一个通用TCP客户机软件,其运行效果如图2所示。图2中左侧用来显示数据,上面的单行文本框显示当前数据,下面的多行文本框显示历史数据。右侧为参数设置,这里连接的是163的POP3服务器,显示模式(Display Mode)为字符型(Char),校验方式(Parity Sort)为无校验码(None),结尾码(End Mark)为回车换行(CRLF),自动大写待发送的数据,收到数据以后播放提示音。图中为点击【Connect】按钮与POP3服务器建立连接以后的会话情况。

图2 TCP客户机软件界面

将计算机当做一个协议转换器,手机与计算机同时处于一个无线Wi-Fi网段内,计算机以TCP服务器的方式工作,则此TCP客户机可以连接此TCP服务器[9]。计算机同时连接RS485工业控制总线的设备,协议转换器将从手机TCP客户机收到的信息转发到RS485设备,再将RS485设备的响应转发到手机的TCP客户机,这样即可用此TCP客户机对多种编码、校验码类型的设备进行测试[10]。其测试工作原理如图3所示。

图3 TCP客户机用于测试RS485设备

6 结语

本文从教学设计的角度,将知识点进行分解,介绍了Android软件设计中常用的消息机制和多线程技术,并用于通用TCP类。通过对TCP客户机与服务器的分析,将两者综合起来,共享其数据接收与发送功能,降低了软件维护成本。最后引入编码与校验技术,使得TCP软件传输的数据适应多种编码方式,又不失可靠性。采用移动互联网实现通用TCP客户机,可以对工业控制总线设备及基本的TCP应用层协议进行测试,有效增加了测试的便携性。

[1] 王小科, 寇长梅. Android入门经典[M]. 机械工业出版社, 2013: 358-363.

[2] 马玉春. 计算机监控系统的仿真开发[M]. 北京: 国防工业出版社, 2015: 198-226, 21-24.

[3] 刘雍, 孙冰, 马玉春. 基于消息驱动的Android TCP服务器类的设计[J]. 海南热带海洋学院学报. 2017(2): 59-63.

[4] 杨宗德, 刘雍, 吕光宏. Linux高级程序设计[M]. 第三版. 北京: 人民邮电出版社, 2012: 305-309.

[5] 马玉春, 汪文彬, 李应勇. 基于TCP客户机的计算机监控系统测试软件的设计[J]. 软件. 2014, 35(5): 1-3+12.

[6] 马程, 魏怡卓, 曹瑜, 等. 老人意外跌倒远程智能监控系统的设计与实现[J]. 软件, 2018, 39(3): 209-217.

[7] 毛昊. 一种服务于Android 移动设备的自适应滚屏技术[J]. 软件, 2018, 39(3): 145-149.

[8] 吕媛媛, 李可. 移动端应用设计中的响应式实现方法[J]. 软件, 2016, 37(0): 107-109.

[9] Guolin. Android ListView工作原理完全解析, 带你从源码的角度彻底理解. 2015.

[10] 耿祥义, 张跃平. Android手机程序设计实用教程[M]. 清华大学出版社. 2013: 258-261.

Instructional Design of TCP Client on Android Platform

MA Yu-chun, LIU Yong*, QIAO Li-juan, WANG Wen-bin

(Hainan Key Laboratory of Embedded Systems at Hainan Tropic Ocean University, Sanya, Hainan 572022, China)

The mobile Internet is entering a period of high-speed popularization. Successful products and service models continue to penetrate into other industry fields. However, one of the most important technologies is the transmission and processing of data. This paper analyses the TCP communication on Android platform, including message processing, thread technology, data encoding and verification, in order to display the desired teaching effect. Finally, the general TCP client is developed and tested based on these technologies.

Android; TCP client; Thread; Message; Encode; Verification

TP311.56

A

10.3969/j.issn.1003-6970.2018.10.004

海南省高等学校教育教学改革研究项目(批准号:Hnjg2018-57);三亚市院地科技合作项目(批准号:2015YD03)

马玉春(1969-),男,教授,中国计算机学会高级会员(编号:06544S),主要研究方向:移动应用与计算机监控技术;乔丽娟(1981-),女,副教授,主要研究方向:计算机网络与移动应用;汪文彬(1969-),男,教授,主要研究方向:进化计算与软件测试。

刘雍(1979-),女,副教授,主要研究方向:移动应用与嵌入式系统。

马玉春,刘雍,乔丽娟,等. Android平台下的TCP客户机教学设计[J]. 软件,2018,39(10):14-17

猜你喜欢
校验码客户机主线
人物报道的多维思考、主线聚焦与故事呈现
更加突出主线 落实四个到位 推动主题教育取得实实在在成效
基于FPGA的循环冗余校验码设计
下沉和整合 辽宁医改主线
基于FPGA和NAND Flash的存储器ECC设计与实现
瘦客户机:安全与便捷的选择
升腾瘦客户机借神码翱翔“云端”
基于Web数据提高访问速度的方法