当前位置: 首页 > 图灵资讯 > 技术篇> 用JAVA编制电子白板软件

用JAVA编制电子白板软件

来源:图灵教育
时间:2024-02-28 17:20:23
用JAVA编制电子白板软件

----在Email中,随着Internet的快速发展、WWW、随着FTP等传统非实时应用的日益成熟,网络用户对在线实时交流的需求不断扩大,如在线会议、远程教学、协同工作等。这方面的应用软件也越来越丰富。这类软件主要分为两类,一类是目前BBS以主页聊天室为代表的纯文本交流工具;另一种是本文介绍的电子白板交流工具。除了聊天室的所有功能外,电子白板还引入了绘画图形交流功能,大大增强了在线交流的形象和直观性,弥补了文本交流的不足。当分布在internet不同位置的用户使用白板进行交流时,一个人在自己的白板上画的图形可以立即显示在别人的白板上。似乎每个人都在同一块白板上画画,彼此之间的距离感大大缩短。

----目前,具有电子白板功能的软件包括微软的Netmeeting等。这类软件在使用前需要用安装盘安装(Netmeting是Internetexplorer4).0的选装件),设置完成后才能使用。相比之下,在主页上使用JAVAplet实现白板功能具有很大的优势。由于它不需要下载、安装和设置传统软件的繁琐步骤,只要将支持JAVA的浏览器连接到Applet的主页,就可以使用白板。用于浏览器的普及(大部分常用浏览器都支持JAVA,比如Internetexploer3.0和Netscapenavigator3.0以上版本),使得这种电子白板的潜在客户群巨大。另外,用JAVA编制电子白板软件还有一个明显的优势,就是整个软件(尤其是白板服务器)可以在NT上编译,无需重新修改。、Unix、支持JAVA的Linux等平台运行。

----目前,基于浏览器和JAVA的电子白板正处于起步阶段,作者还没有在互联网上看到这些软件。由于工作需要,作者开发了一套电子白板软件。在这里,我想向您介绍一些开发经验,以实现共同沟通的目的。

工作原理

----电子白板有两种实现模式,一种是无白板服务器,因此只支持两个用户的直接连接;另一种是白板服务器,原则上不限制在线人数和对话室数量,具体实现视觉服务器的性能和需求。本文介绍了后者。

----当用户需要使用白板与他人沟通时,他们需要将浏览器连接到Applet的主页,并在运行后将其连接到白板服务器,并与服务器建立TCP连接。每个用户都可以在自己的白板上绘制图形和输入文本(嵌入在Applet图片中)。Applet将通过建立的网络连接将这些信息发送到白板服务器,并不断听取和接收来自白板服务器的图形和文本信息,并在用户的白板上重现。白板服务器的作用是不断地从每个Applet中收到信息,并将其转发给其它用户。

----由于浏览器对JAVAplet的限制,Applet只能访问发送Applet的宿主机,因此只能在Applet的主机上运行白板服务器,使Applet能够与远程白板服务器建立联系。

功能设计

----实用的电子白板系统应具备以下基本功能: 浏览白板主页时,用户需要登录才能进行沟通。这将提供交流中使用的名称,必要时也可以进行权限检查。 用户可以根据对话室的对话主题选择参与和退出现有的对话室,并建立新的对话室。可根据电子白板系统的应用领域和需要增加一些权限设置。 用户只能在同一个对话室与用户沟通。对于其他对话室来说,一个对话室的信息是看不见的。 白板应至少具有方便用户的功能,如更换画笔颜色、清除画板(仅影响自己的白板)等。 白板应有操作提示和操作信息反馈栏,向用户显示一些操作提示和操作结果信息,方便用户使用。 用户应该能够暂停和恢复白板工作。

 

----为了增加白板的实用价值,可以考虑增加类似于windows刷工具的方形、圆形等功能。本例作为电子白板基本模型的建立,因此没有添加这些功能。事实上,只要您了解以下白板通信协议集的设计原则,就很容易添加上述功能。

制定通信协议集

----因为JAVA内置的标准基础通信协议是TCP/IP,因此,我们只需要在其基础上建立电子白板的应用层协议集。协议集的模型将采用服务器/客户机的请求/响应模式。通信协议集可根据需要实现的白板功能制定,包括登录、图形传输(服务器发送和客户机发送两部分)、文本传输(分为服务器发送和客户机发送两部分)、服务器需要刷新对话室和会员名单,客户机需要刷新对话室和会员名单,加入指定对话室,退出对话室,建立新对话室,暂停/恢复沟通。

----由于数据传输的正确性已经依靠TCP/IP协议来保证,因此电子白板通信协议集的设计应在保证功能的前提下尽可能简洁,以提高带宽利用率。白板通信协议集的细节如下:

----注意:(S)表示该部分由服务器发出,客户机接收;

----(C)表示该部分由客户机发出,服务器接收;

----数据格式表示:引号之间表示字符串,(short)表示短整形数(2字节),(int)表示标准整形数(4字节)。 登录(C):"log"→用户名字符串。 图形传输(客户机发出)(C):"draw"→(int)颜色值→(short)直线起点横坐标→(short)纵坐标直线起点→(short)横坐标的直线终点→(short)线性终点纵坐标。 图形传输(服务器发送)(S):"draw"→(int)颜色值→(short)直线起点横坐标→(short)纵坐标直线起点→(short)横坐标的直线终点→(short)纵坐标直线终点。 文字传输(客户机发出)(C):"text"→用户在白板对话框中输入文字字符串。 文字传输(服务器发出)(S):"text"→文字输入者姓名字符串字符串→用户输入的文字字符串。 服务器需要刷新对话室和成员名单(S):"refresh"→对话室1主题字符串→对话室1中的用户1姓名字符串→对话室1中用户2名字符串→...→"complete"→对话室2主题字符串→对话室2中的用户1姓名字符串→对话室2中用户2的姓名字符串→...→"complete"→...→最后一个对话室的主题字符串→最后一个对话室的用户1名字符串→最后一个对话室的用户2名字符串→...→"complete"→"ok"。 客户机需要刷新对话室和成员名单(C):"refresh"。 客户机需要刷新对话室和成员名单(C):"refresh"。(服务器收到此命令后,将执行前面的服务器要求更新对话室和成员名单的协议,以响应客户机的要求) 加入指定的对话室(C):"join"→谈话室主题字符串申请加入。 退出交谈室(C):"quit"。 建立新的对话室(C):"new"→新交谈室主题字符串申请建立。(当服务器收到此命令时,它将自动取消用户原来的对话室,并使用户成为新对话室的一员) 暂停交流(C):"pause"。 恢复交流(C):"continue"。

 

----以上是本电子白板软件所遵循的通信协议集。该协议集具有很强的可扩展性,可以根据添加的功能随时扩展。例如,如果需要传输圆形图案,可以在协议集中添加以下协议:“circle"→(int)颜色值→(short)圆心横坐标→(short)圆心纵坐标→(short)圆半径。

编程实现

----程序设计分为JAVAAplication和客户端JAVApplet两部分。

----编程中应注意以下几点: 当客户端接入时,不要使用服务器程序来建立用户线程,并在退出对话室时销毁线程。由于部分操作系统的线程操作机制不完善,线程在线程销毁过程中占用的资源无法完全释放,因此系统资源将在白板服务器运行过程中逐渐消耗。因此,在服务器初始化时,应根据最大允许同时上线的用户数量建立所有用户服务线程。这些线程将等待客户端访问。当用户退出对话室时,线程不会被破坏,而是清除用户数据,重新进入等待访问状态,为下一个用户服务。这确保了白板服务器能够长期可靠运行。 当用户在白板上连续绘制时,可能会产生大量的图形数据。如果客户端Applet在白板AWT事件处理程序中完成将这些数据传输给服务器的任务,由于网络I/O的瓶颈,AWT事件处理线程很可能会受阻,从而影响白板Applet、正在运行的浏览器和其他应用程序的界面相应性。解决办法是让Applet建立后台绘图数据传输线程,白板AWT事件处理程序通过管道流动用户的绘图数据(PipedStream)将网络传输的任务留给线程后返回。 在服务器和客户端Applet中,协议集中每个子协议的实现应分别建立同步块(synchronize),为了限制自由访问网络接插建立的输入流和输出流,该子协议的所有操作都必须在此同步块内完成。当一个线程执行一个子协议时,它可以独占这些网络资源,而其他线程不能访问这些资源,以确保子协议完全正确地执行。但由于同步操作会降低线程调度和执行效率,同步代码块的范围应在保证子协议完全执行的前提下尽可能缩小。 由于协议集中的数据类型包括字符串和整形数,DatainputStream和Dataoutstream被选为程序中的数据输入流和输出流。此外,由于UTF格式的文本支持中文字符集,并且长度信息已经包含在字符串中,因此在本程序的网络通信中使用UTF格式。在设计自己的白板程序时,可以根据需要更改其他文本格式和编码规则,但必须确保输入流和输出流采用相同的格式和编码。 考虑到Netscapenavigator3.0和Internetexplorer3.0仍然广泛使用,这两个浏览器的JAVA虚拟机都不支持更新的JDK1.1标准,因此JDK1.1独特的类库没有用于本程序的客户机Applet部分。

 

----首先介绍服务器程序的编制。主要类别及其成员函数需要确定。列表如下:-chatServer类:----启动服务器程序。----ChatServer():建立服务器管理界面。----initServer():根据允许同时上线的最大用户数量,建立多个用户服务线程,建立服务器插头,初始化对话室数据。----go():启动用户服务线程。----quit():停止用户服务线程,关闭服务器插头,释放所有资源。----User类:为Thread类子类,实现用户服务线程,处理服务器/客户机会。----run():等待客户端接入;客户端接入后,初始化网络资源,进入客户端请求的循环调查状态,并根据客户端请求调用相应的协议处理程序。----sendText():根据文本传输子协议,接收用户发送的文本信息,并将其转发给同一对话室的其他用户。----sendDraw():接收用户发送的图形信息,并按照图形传输子协议转发给同一对话室的其他用户。----commandCenter():选择操作服务器接收到的指令的适当处理程序。----server_ask_refresh():主动刷新对话室和会员名单的服务器。----server_answer_reresh():响应客户机的要求,刷新对话室和成员名单。----server_answer_log():响应客户机登录。----server_answer_join():响应用户加入指定对话室的请求。----server_answer_pause():响应用户暂停交流请求。----server_answer_continue():响应用户恢复沟通请求。----server_answer_newRoom():响应用户建立新对话室的要求。----server_answer_quit():响应用户退出谈判室的请求。----server_ask_text():服务器将文本信息转发给客户机。----server_ask_draw():将图形信息转发给客户机。----refreshToAll():所有在线客户端刷新服务器对谈室数据。----refreshToAllNotMe():除用户外,服务器还刷新了所有在线客户端的对话室数据。----socketClose():申请退出时,用户调用,关闭网络插头,释放线程占用的网络资源。----RoomGroup类别:保存所有对话室数据,直接处理与对话室相关的操作。----newRoom():建立新的对话室。----join():加入指定的对话室。----quit():退出指定的谈话室。----getUsersName():在指定的对话室内返回用户名。----getRoomID():根据对话室的主题进行查询,并返回对话室的ID号。----Room类:本交谈室用户数据的保存和处理。----join():加入这个对话室。----quit():退出谈话室。----getUsersName():返回本交谈室的用户名。----DataBag类:包装图形和文字数据。----AboutDialog类:About对话框的生成可以显示版权信息。----QuitDialog类别:为确认服务器运行是否结束,生成QuitDialog对话框。

----Applet包含的类别及其主要成员函数如下:

----chatapplet类别:Runnnable接口是Applet类的子类。----是白板Applet的核心类别,完成与用户沟通和与服务器沟通的任务。----init():Applet用户界面的初始化。----run()::从白板服务器中回收信息,调用commandcenter命令处理程序。----start():生成并启动Applet线程。----stop():暂停Applet线程。----destroy():停止后台图形数据传输线程,调用关闭网络资源函数。----socketClose():关闭所有打开的网络插头和通信流。----openSocket():建立网络插接和通信流。----commandCenter():从Applet内部集中处理用户、服务器和命令,并调用相应的处理程序。----client_ask_refresh():客户机要求刷新对话室数据。----client_answer_refresh():客户机接收服务器发送的对话室数据。----client_ask_log():在服务器上申请登录。----client_ask_join():申请加入指定的谈话室。----client_ask_pause():暂停交流。----client_ask_continue():恢复交流。----client_ask_newRoom():申请建立新的谈话室。----client_ask_quit():退出谈话室。----client_ask_text():发送用户输入的文本信息。----client_answer_text():接收服务器转发的其他用户的文本信息。----client_answer_draw():接收服务器转发的其他用户的图形信息。----refreshRoomList():展示对话室列表。----refreshUserList():在指定的对话室中显示用户列表。----printChat_Area():在Applet的对话文本框中以指定格式显示用户和其他服务器用户输入的文本。----sendText():判断用户输入的文本是否为有效字符串,如果有效,则调用发送文本函数。----drawBoard_Canvas():在Applet的白板上绘制DataBag对象的值。----boardCanvas_MouseDrag():在白板上拖动鼠标时,调用此函数,将鼠标轨迹包装成数据包,发送到后台网络传输线程。----logButton_Clicked():单击Applet登录按钮时,用户调用此函数,建立网络插头和后台网络传输线程。----其他一系列用户界面事件处理函数:与用户沟通,接收用户输入,直接处理或调用comancenter函数执行用户命令。----RoomData类:存储对话室的主题和用户名的数据类----addUser():将用户名添加到谈话室。----removeUser():删除谈话室中的用户名。----getUsersName():返回谈判室中的所有用户名。----Rooms类:为Vector类子类。存储所有对话室的用户数据。----getRoomByName():RoomData对象按照交谈室的主题返回指定的交谈室。----addElement():添加RoomData对象。----Drawdata类Sendrdddradddata:为Thread类子类实现后台网络传输线程。----run():循环侦听来自Applet主线程的图形信息,并通过网络连接向服务器发送输出流。----quit():关闭该线程与Applet主线程的连接流。----Logo类:为Canvas类子类。用于在Applet中显示图标或版权信息。

----另外,程序中还定义了几个异常类,可以方便程序的异常处理机制设计,提高程序的可维护性和可读性。Applet徽标的默认图形文件名称为“cdownlogo.jpg"(457×60)服务器像标的默认图形文件名称为“icon.gif"(19×17)。默认情况下,服务器占用了10000个端口号。上述项目可根据需要进行修改。