JIS UAN JI YU X IAN DA I H UA
总第152期
文章编号:1006 2475(2008)04 0051 03
收稿日期:2007 04 25
作者简介:雷东升(1974 ),男,河南驻马店人,北京工业大学实验学院信息工程系讲师,研究方向:软件工程。
网络即时通讯系统
雷东升
(北京工业大学实验学院,北京100024)
摘要:网络即时通讯系统是通过网络实现在线交流的工具软件。系统基于C li ent/Server 架构,用Java 语言和SQL 2000作为开发工具,采用Socke t 编程和多线程技术设计并实现。系统能够完成用户注册、用户登录、消息通信、好友管理、在线聊天等功能。
关键词:C /S 结构;多线程;Socket 中图分类号:T P393 文献标识码:A
Net work Synchronous Co mm unication Syste m
LE I Dong sheng
(Experi m enta l Coll ege ,Be iji ng U n i versity o f T echno l ogy ,Be iji ng 100024,Ch i na)
Ab stract :N et wo rk synchronous co mm un ica ti on syste m is a too l so ft ware to communicate on li ne through i n ternet .W it h Java and S QL 2000,net work synchronous communicati on system based on C /S structure is rea lized by adopti ng So cket prog ra mm i ng and mu ltithread i ng techno logy .M any functi ons ,such as ,user reg istra ti on and l ogg i ng i n ,m essag e co mm un ica ti on ,friends m anage m ent and chatti ng on line ,can be fulfilled .K ey w ords :C /S struct ure ;m ultithreadi ng ;Socke t
0 引 言
网络即时通讯系统可作为公司和企业内部的交
流工具使用,既充分利用了网络资源,又保证内部信息的安全。本系统由服务器端程序和客户端程序两部分组成,整体采用Java 平台开发,使用SQL Server 2000进行数据库管理。服务器是后台支持程序,运行的界面仅是一个交互式窗口;客户端程序面向实际用户,通过简单的界面和按钮,实现即时网络通信的功能。
1 系统的总体设计
即时通讯工具采用C /S 模式(客户端/服务器端
模式)设计,是一个三层的C /S 结构(如图1):数据库服务器 应用程序服务器端 应用程序客户端。系统采用C /S 结构,可以将任务合理分配到客户端和服务器端,
从而降低了系统的通信开销。
图1 3层C /S 结构示意图
1.1功能模块划分
网络即时通讯系统主要由两大功能模块组成,如图2所示。即时通讯工具完成通信过程:
客户向服务器注册,告知服务器它在监听某主题;
客户注册之后,向服务器发送消息;
服务器再把消息发送给所有监听此主题的客户。1.2服务器端
服务器端功能:建立连接、操作数据库和监听客
52 计 算 机 与 现 代 化2008年第4期
户。
建立一个ServerSocket 连接,不断监听是否有客户端连接或者断开连接。
服务器端是一个信息发送中心,所有客户端的信息都传到服务器端,再由服务器端根据要求分别发送出去。
数据库数据操作包括录入用户信息、修改用户信息、查找好友数据库的资料以及添加好友数据到数据库等。1.3客户端
客户端功能:新建用户、用户登录、查找好友和即时通讯。
客户端与服务器端建立通信通道,向服务器端发送新建用户的信息,接收来自服务器的信息进行注册。
客户端与服务器端建立通信通道,向服务器端发送信息,完成用户登录。
查找好友是客户端必须实现的功能,此外,用户通过客户端可以查看自己和好友的信息。
客户端可完成信息的编辑、
发送和接收等功能。
图2 功能模块
2 系统的多线程设计
即时通讯系统的设计使用多线程技术。在标准Java 包中提供了相当完善的针对网络通信和I/O 相关操作的类库,利用这些类,可以在很短的时间内设计出一个网络交互系统。2.1服务器端的多线程
服务器端需要和多个客户端同时进行通信,这就是服务器端的多线程。一旦服务器发现一个新的客户端与之建立了连接,就马上新建一个线程与该客户端进行通信。用多线程好处在于可以同时处理多个通信连接,不会出现由于数据排队等待而发生的延迟或者丢失,可以很好地利用系统的性能。
服务器为每一个连接着的客户建立一个线程,为了同时响应多个客户端,需设计一个主线程来启动服务器端的多线程。主线程与进程结构类似,它在获得
新连接时生成一个线程来处理这个连接。线程调度
速度快,占用资源少,可共享进程空间中的数据,因此服务器的响应速度较快,且I/O 吞吐量较大。2.2客户端
客户端能够完成信息的接收和发送操作,这与服务器端的多线程概念不同,可以采用循环等待的方法来实现客户端。利用循环等待的方式,客户端首先接收用户输入的内容并将它们发送到服务器端,然后接收来自服务器端的信息,将其返回客户端的用户。
3 数据库设计
数据库表主要用来存放用户的注册信息和用户的好友资料,利用两张数据库表分别存放此两项资料,即:用户基本信息数据库表(icp)和用户好友数据库表(friend)。
用户基本信息数据库表(icp)包括:用户的号码、呢称、密码、状态、I P 地址、资料、头像号、性别、E m ail 和籍贯等信息。其中,呢称和密码是必须字段;号码和状态由系统自动设置;其余为可选字段。
用户好友数据库表(friend)包括:用户的号码和好友的号码,这两个字段都是必须字段。
4 服务器端设计
4.1主服务器类的设计
设计服务器需要考虑因素:
服务器的运行速度;
服务器的响应速度,包括新建连接和发送数据的响应速度;
I/O (input/outpu,t 输入/输出)吞吐量;流量控制、安全性。
主服务器类实现了服务器端的多线程,即时用Server Socket s=ne w ServerSocket(8080)语句在8080端口创建套接口;使用ne w Server T hread(socket)语句创建新的线程。主服务器类调用Server T hread 类,而每个Ser ver Thread 实体就是一个单独的线程,即对应于客户端连接请求响应的线程。服务器端有一个或多个进程在指定的端口等待客户的连接信息,一旦连接成功,就可以按设计的数据交换方法和格式进行数据传输。客户端只在需要的时候向服务端发出连接请求。
4.2服务器完成的功能
服务器主要实现登录验证、新建用户、好友处理、查找好友、读取资料、添加好友、删除好友、退出下线等功能。其中新建用户模块的实现如下:
新建用户是即时通讯工具的一个基础功能。新建用户也在线程监听函数run(),具体过程:首先使
用C lass.fo r N a m e方法加载数据库驱动类,描述是sun.j d bc.odbc.Jdbc Odbc Driver;然后使用Driver M an ager.get C onnecti o n方法连接数据,数据库名为j d bc: odbc:javaicq;最后服务器接收客户端用户发送的呢称、密码、E m a il、个人资料、籍贯和头像等信息,执行数据库添加操作完成用户的创建。服务器为新建的用户指定唯一的注册号码,并将号码以即时消息的方法发送给用户。
5 客户端设计
客户通过Socket与服务器建立连接。服务器与客户端都通过构造Bu fferedReader、Pri n W t riter来建立输入/输出流,双方通过该输入/输出流来相互传递信息。一旦收到客户方的连接请求,服务器利用accept ()函数返回一个新建的Socket对象,随后客户端向服务器发送消息,诸如注册、登录和查找好友等请求,服务器收到请求后,针对不同的消息处理请求。在这一过程中,服务器端与客户端采用UDP协议通信。 客户端主要实现用户注册、用户登录、消息通信和好友管理功能。其中消息通信模块的实现如下: 5.1创建数据报
消息的收发主要是通过数据报服务实现的。Ja va实现数据报通信的过程除了面向连接的Socket 外,还有无连接的数据报Socket。数据报是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、的、自身包含地址信息的消息,它能否到达目的地,到达的时间,到达时内容是否会改变是不能准确知道的。数据报的通信双方不需要建立连接,对于即时通讯这些不需要高质量的应用程序来说,数据报通信是一个非常好的选择。
5.2发送信息
用户通过在好友列表中好友的I P地址,利用UDP协议与其他用户进行信息交流。信息发送之前先创建一个数据报文包,用来实现无连接的包传送服务。每个数据报文包是用Datagra mPacket类来创建的,D atagra m Packet对象封装了数据报包数据、包长度、目标地址和目标端口。若客户端要发送数据报文包,则构造函数创建Datagra m Packet对象,将需要发送的数据和报文的地址信息放入对象中。
在发送的过程中利用构造函数Datag ra m Packet (byte bu fferedarray[],i n t leng th,Ine t A ddressaddreaa, i n t po rt)构造一个包长度为leng t h的包,它是一个将数据传送到指定主机指定端口号上的数据报文包,参数leng th必须小于等于bufferedarry.leng t h。消息发送通过调用D atagra m Socket对象的send方法实现,它需要以Datag ra mPacket对象为参数,将刚才封装进Datag ra m Packet对象中的数据组成数据报发出。
5.3监听好友消息
系统首先定义一个空数组,该数组用于接收消息中的数据;然后创建数据报,使用rece i v eSocke.t re ceive(rece i v ePacket)函数等待并接收数据报,取得数据报中的数据。根据取得数据的类型,将判定好友是否上线:若有好友上线,则好友的头像变彩色;若有好友下线,则好友头像变为灰色。
5.4接受消息
为了接收从服务器返回的结果数据报文包,需要创建一个新的Da tagra mPacket对象。该对象利用了Datag ra m e Packet类的另一种构造方式Datag ra m Packe t (byte bufferedarry[],i n t l e ngth),只需指明存放接收的数据报的缓冲区和长度。系统可调用Datagra m Socket对象receiver()函数来接收数据报,并将Data gra mPacket对象作为该函数的对象。rece i v e()方法会一直阻塞直至收到一个数据报文包,而该数据存放在Datagra mPacket对象的缓冲区中。数据报文包还包含了发送着的I P地址和端口号等信息。
6 结束语
本系统采用当前比较流行的Socket编程和多线程技术,系统基于C/S架构,能够在局域网上实现多人在线聊天功能,使用简单、界面友好,但是系统在安全性能方面还需要考虑。
参考文献:
[1] 殷兆麟,张永平,姜淑娟.Java网络高级编程[M].北京:
清华大学出版社,北京交通大学出版社,2005.
[2] 求是科技.Java信息管理系统开发[M].北京:人民邮电
出版社,2005.
[3] 雷之宇.Java项目开发实践 网络篇[M].北京:中国
铁道出版社,2005.
[4] Pau lN ielsen.M icroso ft SQL Server2000宝典[M].北京:
中国铁道出版社,2004.
[5] 黄凯,陶宏才.即时通讯系统服务器端简要设计[J].成
都信息工程学院学报,2006,21(4):535 538.
[6] 钟珞.软件工程学[M].北京:清华大学出版社,2005.
[7] 王大锋,刘在强,冯登国.P2P即时通讯软件监控系统的
研究与实现[J].计算机工程与应用,2005,41(10):128
130,147.
[8] 彭力,汪秉文.即时通讯软件服务器的设计与实现[J].
微机发展,2004,14(10):6 8.
[9] 丁忠,刘志勤.多服务器分布式即时通讯系统模型的设
计[J].微计算机信息,2006,22(27):181 183.
[10] 黄荣升.一种基于扩展SIP协议的即时通讯系统设计
与实现[J].现代电子技术,2006,29(11):56 58.下载本文