基于WWW的电子白板的设计

基于WWW的电子白板的设计

 

 

摘要:

随着Internet的发展,在EmailWWW等的应用日益成熟的同时,在线实时交流的需求不断扩大,此类软件也大量涌现。用JAVA开发的电子白板弥补了纯文本非实时交流的不足,既增加了形象性,又加强了交互性。

在通讯技术中,选用Socket通讯机制实现客户端与服务器端的信息交换,简化了网络中的技术细节,方便可行。


关键字:

电子白板、实时交流、JavaSocket

 

 

引言:

随着信息高速公路的建立,Internet的普及,多媒体,网络技术的迅猛发展,人类已经进入信息化社会。在非实时应用日趋成熟的同时,广大网络用户对在线实时系统的需要不断扩大。此类软件主要分为两类:一类是BBS和主页上的聊天室为代表的纯文本型系统工具,另一类就是本文要介绍的白板类系统工具。本文将主要对其中的关键技术---Socket通信机制进行讨论,并提出白板中图形的擦除设计方案。

 

 

概念:(重点)

所谓电子白板(whiteboard),指的是一个虚拟公用区域,CSCW(Computer Supported Cooperative Work,计算机支持的协同工作)中参加协作的各个成员的计算机上都有一个白板的视图,白板上的内容既可以是手绘的简单图形(直线,曲线,矩形等),也可以是文字,图像,音频,视频.白板数据是共享数据,当一个用户修改了其中的数据之后,就要把修改立即通知给其他用户,让他们及时更新自己的白板视图.其更新结果应该立即反映在其他所有用户的视图上,即所谓的"你见即我见"(WYSIWIS,What You See Is What I See)

 

 

Socket技术:

白板用Java语言实现,具体是客户端的程序Applet和服务器端的Application.因此,如何使AppletApplication进行通信,Server端来为Client端服务 由于Socket提供了连接任何流到通信接口的方法,这样就可以通过输入输出流来抽象网络层的具体操作,把应用程序与网络技术细节分开.只需要考虑流的读写操作,而不用关心网络的具体细节.所以,选用Socket机制来实现客户端与服务器端的通信是方便的,可行的。

 

 

Socket 简介:

Socket最早是Unix操作系统中的概念,是为方便网络编程而开发出的一个程序接口,后来被广泛地应用在各种平台及系统中.Internet/Intranet领域中,Socket也是一个相当重要的概念.Socket译为中文为套接字,指两个程序间进行双向数据传输的网络通信端点,是网上两个主机之间必要的数据无缝传输.Socket由每一个主机的终点和端口地址加以区别.:太原理工大学的www主机www服务的Socket就是:www.tyut.edu.cn:80,80www服务默认的http端口号.利用Socket可以与相应的服务进行通信.Java语言中,也引进了Socket的概念,提供了Java.net.SocketJava.net.ServerSocket类库,这两个类一起提供完整的TCP/IP连接的支持.前者用于客户端,后者用于服务端.某种服务通过监听一个端口号,可以与向该端口号发出请求的客户程序进行通信.

当一个Socket建立后,它就与本地的IP地址联系起来,IP地址仅简单地指定出入主机的特定路径,而连接亦可有多个.套接字地址完整地说是应用端口号,协议和本地IP地址的集合,它形成一个应用链路的终点,有效的激活一个套接字到套接字的连接.Socket通信机制提供了两种通信方式,:面向连接的通信方式和面向无连接的方式.在设计时我们采用了前者----面向连接的通信方式,即通信前必须进行一次连接,从而建立起一条通信链路,并以字节流的形式在通信双方之间进行数据传输服务,它是一种安全,可靠的通信方式。

 

 

 

 

使用Socket
在电子白板的设计中,Client端的Applet相关代码如下
:
public class chatapplet extends Applet implements Runnable{
Socket s=null;
public void init(){
port=Integer.Parse(getParament("port"));
url=getcodeBase();
public void openSocket() throw IOException{
s=new Socket(url.getHost(),port);
io_in=new DataInputStream(s.getInputStream());
io_out=new DataOutputStream(s.getOutputStream());
}}
上面的代码中,第二行声明一个Socket变量s,在初始化方法中,得到在html文档中预先设置好的端口号为20000,getcodeBase()得到主机的IP地址.openSocket()方法中,创建一Socket对象,Socket的端口号为服务器端ServerSocket所监听的端口号,主机为该Applet的宿主机.由于Java Applet安全性,Applet 只允许向其宿主机打开Socket连接.若想与任何主机建立Socket连接,则需要对Applet进行数据签名.创建好Socket连接后,便可进行通信
.
Server
端的Application相关代码如下
:
void initServer(int port) throw IOException{
try{ ss=new ServerSocket(port,5);
//
建立一个
ServerSocket
…….
} }
class User extends Thread {
Socket s=nulll;
ServerSocket ss=null;
public void run(){
try{ while(true){
s=ss.accept();
io_in=new DataInputStream(s.getInputStream());
io_out=new DataOutputStream(s.getOutputStream());
}
在服务器端程序中,当生成新的ServerSocket对象时,它还不能侦听到达端口的客户机请求,这要在调用ServerSocket对象的accept()方法后才开始,accept()方法要等客户机连接服务器后才返回,ServerSocket并不用于实际通信,它只为服务器端程序生成一个新的Socket实例,与相连的客户机交谈,这个Socket实例在accept()方法接受一个连接时生成的.值得注意的是在run()函数中使用了一个while(true)语句,用它来实现轮询,这是因为ServerSocket ss 在接收到客户请求并激活相应的User线程后,还要监听下一个客户的请求,重新调用accept()方法,进入封锁状态.

 

 

 

 

开发流程

整个开发内容分为client server两个部分。客户端使用swing技术来继承applet开发客户端界面。使用socket机制与服务器端进行通讯。

服务器端使用serversocket 进行端口监听,监听客户端使用socket机制进行的连接请求。

使用输入,输出流进行数据传输。目前第一版本实现文本的传输,直接使用inputStream()和outputStram()来实现数据的传输。在version2.0中,将使用自定义的包结构来进行传输数据的封装,以实现客户端和服务器端图形的传输。

       自定义包接口示意如下:

      

图形类型

X

Y

W

H

半径

背景颜色

边框颜色

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      

   所以传输的包的例子如下:

       1,102,202,100,100,null,null,1,1

       表示画一个长方形,x坐标为:102Y坐标为:202,高度为100,宽度为100,背景色为黑色,前景色为黑色。

 

 

       目前需要开发的版本是version1.0,在这个版本中需要传输的是文本,所以不需要定义传输的包结构。我们使用arraylist数据结构对说有输入的内容进行保存。Arraylist不是线程同步的数据接口,允许在其中放置null,其无需预定义大小,它将随着放入内容的大小,自动增加已经存放内容的一半作为扩展。

 

 

       version2.0中,文本使用arraylist保存,但是图形将使用vector数据结构进行保存,它的特点是可以根据key值进行图形的查找,方便我们对图形进行删除操作。然后后使用system.gc()来清空垃圾,释放所使用的内存。

 

 

 

 

 

 

其他问题...

    客户端发送的信息应该分为公用以及私有的信息,然后SendMessageCenter根据信息的类别来判断应该将信息发送给哪些用户。

 

 

    拥有权限的客户端可以动态地建立聊天频道,然后SendMessageCenter还可以判断信息所属的聊天频道来决定向谁发送信息

 

 

    客户端可以执行聊天命令,例如返回当前服务器的在线信息,返回某个用户的相关信息,退出聊天系统等等。

 

 

    所有这些问题都可以通过ClientServer类的SendMessageCenter方法建立一个不很复杂的通信协议来完成。一个通信协议就是一组约定,将相关的信息制定一个格式标准,让接收方和发送方都知道这条信息将作为什么身份进行通信。

 

 

    例如,发送方发送的信息为普通的聊天信息时,可以增加一个前缀:words = "[chatmessage]" + words,而发送一条要求返回在线名单的信息时,可以发送另一个前缀 words="[returnonlinelist]"

 

 

    SendMessageCenter接收到客户端信息时,首先判断message的前缀,如果是"[chatmessage]",则传送给其他客户端,如果是"[returnonlinelist]",则返回给该客户端一个OnlineList

 

 

一般地,这样就制定了一个简单的通信协议。

 

 

 

 

通讯字符

中文解释

举例

SDM,IP,MSG

发送给某人,IP(包括端口),信息

 

 

UUL(Hashtable)

服务器发送信息给客户端,要求客户端更新用户列表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值