前言
随着Internet的迅速发展在EmailWWWFTP等传统的非实时应用日趋成熟的同时广大网络用户对在线实时交流的需求不断扩大如网上会议远程教学协同工作等这方面的应用软件也日益丰富起来该类软件主要分为两类一种是以目前BBS和主页上的聊天室为代表的纯文字型的交流工具另一种就是本文要介绍的电子白板类交流工具电子白板除了具备聊天室的全部功能外更重要的是它还引入了绘画图形交流功能使网上交流的形象性和直观性大大加强了弥补了文字交流的不足当分布在Internet不同位置的用户用白板进行交流时一个人在自己的白板上绘制的图形可以马上在别人的白板上显示出来好象大家都在同一块白板上绘画彼此间的距离感大大缩短了
目前具有电子白板功能的软件有微软的Netmeeting等此类软件在使用前需要用安装盘安装(Netmeeting是Internet Explorer 的选装件)在设置完成后才能使用相比而言在主页中用Java Applet实现白板功能就显得优势很大因为它不需要传统软件的下载安装和设置的繁琐步骤只要用支持JAVA的浏览器连接到该Applet所在主页就可以使用白板用于浏览器的普及性(大部分常用浏览器都支持JAVA如InternetExploer与Netscape Navigator 及以上版本)使得这种电子白板的潜在客户群是巨大的此外用JAVA编制电子白板软件还有一个显而易见的优势就是整个软件(尤其是白板服务器)无须重新修改编译就可在NTUnixLinux等支持JAVA的平台上运行
目前基于浏览器和JAVA的电子白板正处于起步阶段笔者尚未在网上看到该类软件由于工作需要笔者自行开发了一套此类电子白板软件这里想将开发中的一些经验介绍给大家以达到共同交流的目的
工作原理
电子白板有两种实现模型一种是无白板服务器因此仅支持两个用户直接连结另一种是有白板服务器原则上不限制同时上线人数和交谈室个数具体实现上可视服务器性能和需要而定本文要介绍属于后者
当用户需用白板与他人交流时需要先用浏览器连到Applet所在主页Applet运行后会连接到该白板服务器和服务器建立TCP连接每个用户可以在自己的白板上(嵌在Applet画面中)绘制图形和输入文字Applet会将这些信息通过已建立的网络连接发往白板服务器并不断侦听接收来自白板服务器的图形和文字信息将其再现在用户的白板中白板服务器的作用是不断侦听接收来自各Applet的信息并将其转发给其他用户
由于浏览器对Java Applet的限制使得Applet只能访问发送该Applet的宿主主机因此只能在该Applet所在主机上运行白板服务器使得Applet能建立和远程白板服务器的联系
功能设计
一个实用的电子白板系统应该具备以下基本功能
用户在浏览到白板主页时需登录后才能进行交流这将提供交流时用的名字必要时还可做权限检查
用户能够根据交谈室的交谈主题选择参加和退出现有的交谈室并且能建立新的交谈室可以根据该电子白板系统的应用领域和需要附加一些权限设置
用户只能和在同一交谈室中的用户交流一个交谈室的信息对于别的交谈室是不可见的
白板应至少具有一些如更换画笔颜色清除画板(仅影响自己的白板)等方便用户的功能
白板应具有一个操作提示和操作信息反馈栏对用户显示一些操作提示和操作结果信息这样可以方便用户使用
用户应能暂停和恢复自己的白板工作
为了增加白板的实用价值可以考虑增加如与windows画笔工具类似的画正方形圆形等类似功能本例作为电子白板基本模型的建立故没有加入这些功能实际上只要了解了下面要介绍的白板通讯协议集的设计原则增加以上功能是非常容易的
通讯协议集的制定
由于JAVA内置的标准基础通讯协议是TCP/IP所以我们只需在其基础上建立电子白板的应用层协议集协议集的模型将采用服务器/客户机的请求/应答模式可以根据需要实现的白板功能制定通讯协议集协议集中包括登录图形传输(分服务器发出和客户机发出两部分)文字传输(分服务器发出和客户机发出两部分)服务器要求刷新交谈室及成员名单客户机要求刷新交谈室及成员名单加入指定交谈室退出交谈室建立新交谈室暂停/恢复交流等部分
由于已经依靠TCP/IP协议保证数据传输的正确性所以在这个电子白板的通讯协议集的设计中应在保证功能的前提下尽量简洁来提高带宽利用率白板通讯协议集的细节可参考如下
注意
(S)表示该部分由服务器发出客户机接收
(C)表示该部分由客户机发出服务器接收
数据格式表示引号之间表示字符串(short)表示短整形数(字节)(int)表示标准整形数(字节)
登录(C)log→用户名字符串
图形传输(客户机发出)(C)draw→(int)颜色值→(short)直线起点横坐标→(short)直线起点纵坐标→(short)直线终点横坐标→(short)直线终点纵坐标
图形传输(服务器发出)(S)draw→(int)颜色值→(short)直线起点横坐标→(short)直线起点纵坐标→(short)直线终点横坐标→(short)直线终点纵坐标
文字传输(客户机发出)(C)text→用户在白板对话框中输入的文字字符串
文字传输(服务器发出)(S)text→文字输入者姓名字符串→该用户输入的文字字符串
服务器要求刷新交谈室及成员名单(S)refresh→交谈室主题字符串→交谈室中的用户姓名字符串→交谈室中的用户姓名字符串→→complete→交谈室主题字符串→交谈室中的用户姓名字符串→交谈室中的用户姓名字符串→→complete→→最后一个交谈室主题字符串→最后一个交谈室中的用户姓名字符串→最后一个交谈室中的用户姓名字符串→→complete→ok
客户机要求刷新交谈室及成员名单(C)refresh(服务器收到此命令会执行前面的服务器要求刷新交谈室及成员名单子协议以响应客户机请求)
加入指定交谈室(C)join→申请加入的交谈室主题字符串
退出交谈室(C)quit
建立新交谈室(C)new→申请建立的新交谈室主题字符串(服务器收到此命令会自动在该用户原来所在的交谈室中注销并使该用户成为新交谈室的一员)
暂停交流(C)pause
恢复交流(C)continue
以上为本电子白板软件所遵循的通讯协议集这个协议集的可扩充性很强可以随时按增加的功能扩充协议集例如需要传送圆形图案则可将如下协议加到协议集中circle→(int)颜色值→(short)圆心横坐标→(short)圆心纵坐标→(short)圆半径
编程实现
程序设计分服务器JAVA Application和客户端Java Applet两部分进行
编程中需要注意以下几点
服务器程序不要采用客户端接入时建立用户线程退出交谈室时销毁线程的工作流程因为有些操作系统的线程操作机制不够健全在线程销毁时线程所占资源不能被完全释放以致于在白板服务器运行的过程中将逐渐消耗掉系统资源所以应在服务器初始化时按照最大允许同时上线的用户数建立所有用户服务线程这些线程将等待客户端接入当用户退出交谈室时线程并不销毁而是清除用户数据重新进入等待接入状态准备为下一个用户服务这样就保证了白板服务器可以长期可靠运行
当用户在白板上连续绘画时可能产生大量的图形数据客户端Applet若在白板的AWT事件处理程序中完成将这些数据传输给服务器的任务则很有可能由于网络I/O的瓶颈作用使得AWT事件处理线程受阻从而影响白板Applet浏览器其他正在运行的应用软件的界面相应性解决的办法就是使Applet再建立一个后台绘图数据传输线程白板的AWT事件处理程序将用户的绘图数据通过管道流(PipedStream)传输给这个线程后就返回把网络传输的任务留给这个线程进行
在服务器和客户端Applet中协议集每一个子协议的实现都要分别建立一个同步块(synchronize)该子协议的全部操作都要在这个同步块内完成以限制自由访问网络接插建立的输入流和输出流使得当一个线程执行一个子协议时能够独占这些网络资源而使别的线程不能访问这些资源以保证线程能够完整正确地执行子协议但是由于同步操作会降低线程调度和执行效率所以要在确保子协议完整执行的前提下尽量缩小同步代码块的范围
由于协议集中的数据类型既有字符串又有整形数因此在程序中选用DataInputStream和DataOutputStream作为数据输入流和输出流此外由于UTF格式的文本支持中文字符集且在字符串中已包含长度信息可以方便数据读取故在本程序的网络通信中的字符串全部采用UTF格式设计自己的白板程序时可以根据需要换用其他文本格式和编码规则但一定要保证输入流和输出流采用的是同一种格式和编码
考虑到目前Netscape Navigator 和Internet Explorer 目前仍普遍使用而这两种浏览器的JAVA虚拟机都不支持较新的JDK标准所以在本程序的客户机Applet部分中没有使用JDK特有的类库
首先介绍服务器程序的编制需确定主要的几个类及其成员函数列表如下
ChatServer类服务器程序的启动类
ChatServer()建立服务器管理界面
initServer()建立服务器插结初始化交谈室数据按照