APP下载

基于Android画板的同屏传输

2017-12-18陈富琴周渊平

网络安全与数据管理 2017年23期
关键词:内网画板线程

陈富琴,周渊平

(四川大学 电子信息学院 ,四川 成都 610065)

基于Android画板的同屏传输

陈富琴,周渊平

(四川大学 电子信息学院 ,四川 成都 610065)

在利用电话进行通信时,有时候语言的描述可能并不能很好地表达所传递的信息,如果此时双方能够及时地开启一个画板实时传输数据,在画板上手绘图表等信息来帮助表达意图,可提高通信的质量和效率。基于Android平台实现了画板间的实时通信功能,可在不同网络情况下实时传输画板数据。该画板是将移动设备作为手绘输入板,用户可以通过手指触摸屏来实现绘图等功能。为了确保无论用户在什么样的网络环境下都能够有效通信,文中提供了三个不同的解决方案。重点描述了当通信双方在不同局域网时,利用UDP打洞传输数据的通信方式。

画板;实时传输;UDP;网络

0 引言

随着网络技术与移动互联网的飞速发展,智能手机与人们的生活联系越来越紧密。如QQ、微信等应用软件都给人们提供了一个与外界交流的方式。本文的画板传输也是基于这样的理念,让通信双方能够及时地获取对方的消息。本文的通信模式采用的是端对端的传输。Android系统是一种基于Linux的自由及开放源代码的操作系统,主要应用于移动设备。在此基础上开发画板是非常有市场前景的。由于移动端的移动特性,用户所处的环境可能随时在发生改变,本文根据用户移动端所处的不同网络环境,选择不同的传输方式,保证用户的最佳体验。本文提出了三种传输方式来保证传输质量和效率。当处于同一个局域网的用户进行通信时,采用直接传输的方式。当用户双方处在不同局域网时,采用的是UDP打洞的方式。P2P的通信核心就是UDP打洞[1]。在以上两种方式都不成功的情况下,为了保证通信,采用服务器中转通信的方式。在TCP和UDP传输方式中,由于UDP的传输是基于无连接的,传输效率更高;UDP程序设计结构相对简单,并且对系统的资源要求较少,因此本文选择了UDP的传输方式,同时也更符合本文的设计意图。

1 总体框架

1.1 同一个局域网内的用户通信

局域网是指在某一区域内由多台计算机互联组成的计算机组,两个移动端连接的无线信号很可能处于同一个局域网中,众所周知处于同一个局域网的两个主机是可以互相ping通的,在同一个局域网的主机是可以相互通信的。因此如果移动端的两个IP地址为同一个局域网的私有地址,则可以直接通信,这是最快速高效的通信方式。

1.2 两用户处于不同局域网

图1 UDP打洞流程图

内网主机不能直接用私有地址访问外网的主机,私有地址是不能够被路由的。它要与外网通信必须经过NAT(网络地址转换)设备。NAT功能一般都会被集成到路由器、防火墙等设备中。当内网的私有地址要与外网通信时,NAT就在网关处将内网地址转成公网地址,才能使内网地址在外部公网上正常使用。NAT维持了一张表,记录了内网地址出去的公网地址。外网地址传输进来的时候根据这张表进行查找,以找到接收方。这种情况下采用UDP打洞方式进行传输,利用了路由的NAT功能[2]。UDP打洞流程图如下图1。

1.3 中转通信方式

在以上两种情况都失败的情况下,选择利用中转服务器来传输数据。主动请求方直接把传输的数据发送给中转服务器,中转服务器再帮忙转发给被请求方。这种情况下,传输效率比较低,传输的数据太多时,服务器承受的压力较大,一般不会优先考虑这种方式。图2是中转服务器示意图。

图2 服务器中转图

1.4 总体通信流程

通过以上三种方式,保证用户在不同的网络情况下,都能够成功通信。本文总体测试流程图如图3。

图3 总体测试流程图

2 客户端

2.1 客户端总体概述

用户的客户端由两个界面组成,一个是注册界面MainActivity,一个是画板界面SecondActivity。注册界面是用户用来注册自己的信息到服务器和通知服务器想要通信的另一客户的信息。电话通信是Android智能手机最基础最核心的功能,每个移动端都有属于自己的电话号码。因此选择手机号码作为每一个客户端的唯一标识。注册信息时,需要把自己的手机号注册到服务器上,只有在服务器上注册了信息的用户才能够让其他用户联系到。用户主动发起通信时,必须给服务器发送请求方的手机号码。如果双方同时在线,则进入画板界面进行数据的传输。

2.2 注册界面

注册界面由两个文本输入框和三个按钮组成,主动请求方和被动连接方都有不同的注册协议。

注册输入框,输入本机的电话号码,点击注册按钮,调用clientSend函数将获取本机号码、本机的IP(一般是内网地址)及本机端口。它们以逗号进行连接,将数据封装好发送给服务器。主动方和被动方都有这一步骤。

主动方需要手动输入联系人号码,点击好友按钮,调用getComm函数。将被动方的电话号码与主动方的号码及主动方的私有地址和端口以逗号的方式连接,发送给服务器,并等待服务器返回被动方的地址信息。地址信息包括被动方的内网地址、公网地址及端口号等信息。

主动方从服务器获得被动方的地址后,进行以下几个步骤:

(1)首先向被动方的私有地址直接发送数据包,包括被动方的电话号码。如果能够收到被动方返回的连接成功信息,即表明这两个用户处于同一个局域网,可以直接通信。执行成功后直接跳转传输画板。

(2)如果发送的数据包失败,则表明两个用户处于不同的局域网。即利用返回的被动方的公网地址和端口进行UDP穿透。

(3)如果UDP打洞失败,再直接将数据发给转发服务器,让它直接将数据转发给被动方。

被动接收方不需要输入联系人的号码,直接点击通信按钮,调用waitToComm函数,阻塞等待被连接。当它收到数据包时,首先与自己的本机号码比较,如果一致,则给对方返回连接成功的信息。然后进入画板,实现通信。

2.3 画板界面

实现画板的常用方式有自定义View、继承SurfaceView,也可通过Canvas类实现。本文采用第一种方式实现同步画板。定义了一个画笔,用来绘制线条。绘制的原理是通过重写onTouchEvent事件,根据用户手指的滑动位置的坐标记录相应的路径。MotionEvent.ACTION_DOWN记录手指开始绘制的起点,MotionEvent.ACTION_MOVE记录手指的移动,MotionEvent.ACTION_UP记录手指绘制的结束点。通过不断地刷新整个画板来重绘画板。在此基础上,增加了擦除功能、保存功能、改变画笔大小、调整画笔颜色等辅助功能[3]。

2.3.1发送方式

在MotionEvent.ACTION_UP设置了一个监听按钮,当用户手指离开触摸屏代表用户一条路径画完,此时开启一个发送线程,将获得路径数据发送给通信另一端。

2.3.2接收方式

进入画板就开启了一个接收线程,是阻塞式接收,只有接收到了数据才能更新界面。接收过程利用了Android的Handler机制。在Android系统中只允许主线程来修改UI组件,SecondActivity界面的更新画板操作不能直接在子线程完成,必须利用Handler传输到主线程完成。

3 服务器端

3.1 服务器的多任务处理机制

服务器创建了一个线程池来限制系统中执行的线程数量。线程池可以减少在创建和销毁线程上所花的时间以及系统的开销[4]。利用Executors的工厂方法来创建一个固定线程数量为50的线程池,即可同时满足50个线程同时工作,属于多线程并发执行任务[5]。当没有空闲线程的时候,任务会在阻塞队列中排队等待。

阻塞队列使用的是LinkedBlockingQueu队列,默认的keepalive时间是0 s。最大线程池的数量与核心线程池的数量都是50。当提交新任务时,首先判断核心线程池的线程数量是否已经为50,如果小于50,则创建新线程马上执行任务,否则判断阻塞队列是否已满,如果没满,则在阻塞队列中等待,否则就得按照RejectedExecutionHandler处理,默认的处理方式是直接抛出异常。

3.2 服务器的存储

利用ConcurrentHashMap存储用户的注册信息。ConcurrentHashMap采用了分段锁的设计,不仅保证了同步操作,同时大大提高了并发环境下的处理能力。

ConcurrentHashMaphm

=newConcurrentHashMap();

第一个参数String存放的是用户的唯一id手机号码字符串,String[]数组存放的是注册用户的IP地址和端口。每个用户都有所在局域网的私有地址和通过NAT的公网地址[6]。将其都存放在数组中。数组第一个元素存放的是私有地址和端口,第二个元素存放的是公网地址与端口。

3.3 服务器的运行

服务器一直在9999端口监听,接收到数据后,就交给线程池中的线程处理。线程处理任务包括以下几个步骤:

(1)将服务器收到的数据用逗号分隔成一个字符串数组。

(2)判断数组的大小,如果数组大小为2,即表明这个用户是来注册的,再继续判断第一个位置上的字符串是否为电话号码,如果是就将号码存入ConcurrentHashMap,作为键,其值为一个数组。数组的第一个元素,即用户的私有地址和端口。第二个元素即为经过NAT后的公网地址和端口。

(3)如果数组的大小为3,即用户是请求与另一个用户进行通信。获取数组中第一个元素,元素的值是被动方的电话号码,在ConcurrentHashMap中查询被动方号码,如果查询成功,则将获取到的被动方的私有地址和公网地址一起发送给主动方。如果查询不到号码,等待10 s后,还是查找不到,则此次查询失败。

服务器运行流程图如图4所示。

图4 服务器流程图

4 测试结果

本次测试的实验环境:两个服务器程序存放在购买的阿里云服务器上,阿里云服务器的公网IP:120.24.211.74,内网IP:10.44.97.37。服务器程序采用Java开发,因此首先要配置jdk的环境,再在cmd命令中运行服务器程序。图5、图6分别是服务器程序启动的界面和客户端的注册界面。

图5 服务器启动界面图

图6 客户端启动界面图

(1)同一个局域网的内网测试

主动方的内网地址:192.168.191.4,端口号为58276,注册号码为:18200397836。被动方的内网地址为:192.168.3.12,端口号为37299,注册号码为:18200394709。在服务器注册的情况如下图7。公网地址和端口是通过DatagramSocket获取的。图8是客户端的请求情况,图9是双方通信的结果。

图7 服务器的注册信息

图8 客户端请求信息

图9 两客户端通信信息

(2)外网的UDP打洞情况

主动方的地址变为:10.35.196.240,端口号为51772,注册号码为:18200397836。被动方的内网地址为:192.168.191.4,端口号为58276,注册号码为:18200394709。在服务器注册的情况如图10,通信情况如图11。

图10 UDP打洞注册信息

图11 UDP打洞通信

(3)中转服务的处理

中转服务器充当着两个客户端之间的通信使者身份,它将收到的主动方的数据直接转发给被动方,被动方返回信息给主动方也必须经过中转服务器的传输。传输效果与上图类似,不再赘述。

5 结论

本文通过三种不同的方式成功地完成了基于Android的画板传输,使用户处在不同的网络环境下都能够与另一用户进行通信,实现了本文的设想。接下来的工作是将此应用与电话拨号功能连接起来,使人们在通话时,随时可以在不影响通话的情况下调用画板,进行实时传输,帮助提高通信质量和效率。

[1] 姚彬. P2P流媒体系统数据调度和传输层优化技术研究[D]. 杭州:浙江大学, 2013.

[2] 周敏,余慕春,黄维丰.综合UDP打洞与Http代理的SIP穿越NAT方案[J].计算机技术与发展,2014(8):147-151.

[3] 饶永生. 超级画板作图效率研究[D]. 广州:广州大学, 2009.

[4] 杨薇, 赵亮. Web服务器性能优化研究[J]. 电子技术与软件工程, 2016(13):20.

[5] 宋广华. 多线程内存数据库服务器设计[J]. 计算机工程与应用, 2001, 37(18):107-110.

[6] 童怡. 浅析NAT技术[J]. 科技资讯, 2009(32):191.

Transmission between Sketchpads based on Android

Chen Fuqin, Zhou Yuanping

(College of Electronics and Information Engineering, Sichuan University, Chengdu 610065, China)

When using the telephone to communicate,sometimes the description of the language may not express the message well.At this time,if both sides can timely open a drawing board to transmit data by drawing charts or other information on the drawing board,it can improve the quality and efficiency of communication. In this paper, the function of reat-time communication between the sketchpads is realized based on the Android platform. It can transmit data in real time in different network circumstances. The mobile device is used as the hand drawing input board, and the users can realize the drawing function through the finger touching screen. To ensure that users can communicate in any network environment, this paper provides three differet solutions.This paper importantly describes the communication mode of data transmission by using UDP hole when the communication is in different LAN.

drawing board; real-time transmission; UDP; network

TP399

A

10.19358/j.issn.1674- 7720.2017.23.019

陈富琴,周渊平.基于Android画板的同屏传输[J].微型机与应用,2017,36(23):66-69.

2017-06-12)

陈富琴(1992-),女,硕士研究生,主要研究方向:信号与信息处理。

周渊平(1955-),男,博士,教授,博士生导师,主要研究方向:通信与信息系统,信号与信息处理。

猜你喜欢

内网画板线程
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
企业内网中的数据隔离与交换技术探索
内外网隔离条件下如何实现邮件转发
七彩画板
七彩画板
七彩画板
Java的多线程技术探讨