即时通讯软件的设计与实现

  • 格式:doc
  • 大小:458.50 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

即时通讯软件的设计与实现

1 系统实现模块

1.1 服务端模块

服务端主要包括三个模块:

1.网络模块,建立TCP服务器,负责监听端口,与客户端建立连接并接受和发送数据。

2.应用模块,负责处理从网络模块接收到的数据,予以分析处理,进行转发或对数据库进行操作,并返回相关信息。

3.数据层,数据层用来与数据库建立连接,应用模块必须通过数据层来进行数据库的操作。

日志记录

图4.1 系统模块图

1.2 客户端模块

用户端包块以下模块:

1.用户界面模块,此模块包括客户端的操作界面,由NetBeans编写的GUI,进行了较多的美化,采用偏向Vista的风格。

2.网络模块,此模块包括两个小模块,TCP模块用于和服务器端通讯,而UDP 模块则负责和客户端进行P2P通讯。

3.聊天模块,此模块负责在用户聊天时候,对聊天的数据进行封装,对聊天的图片也进行压缩,以适用网络传输。在接受到聊天数据之后,又会对聊天数据进行分解操作,最后生成聊天内容。

4.群组模块,此模块包括群组聊天、群组的创建、管理、更新等功能。

5.文件传输模块,此模块用于实现客户端之间的文件传输功能。

6.视频聊天模块,此模块用于实现客户端之间的视频聊天功能。

7.系统设置记录模块,此模块用于实现保存聊天记录,登录日志,以及保存系统设置信息的功能。

系统记录模块

图4.2 客户端模块图

2 数据库设计

2.1用户表设计

用户表是系统中的基础表,主要用来记录用户注册时的各种信息,此表还有一个从表userlogin表用来记录用户登录和状态信息。[12]

Userinfo表

UserLogin表

用户关系表是用来保存用户之间的好友关系的数据表,查询好友列表的时候要从此表中查询与自己ID想关联的好友ID,type字段可以设置两者的关系,其中1为好友关系,0为黑名单。

其他表,如组群表,族群信息表就不在此一一列出。

3 系统模块的详细设计

此章节将叙述系统部分模块的设计方法和具体实现。

3.1 网络模块的设计实现

本系统采用TCP和UDP混合的网络通讯,客户端与服务器之间登录验证时采用TCP连接,登录之后,客户端与服务器采用UDP方式保持通讯,客户端和客户端之间采用UDP连接,如果无法直接连接,通过服务器申请UDP穿透NAT,如果失败,则消息通过服务器中转传递。

因为要在网络通讯中直接传递对象,故采用基于Java NIO的I/O的Cindy异步框架,Cindy是一个Java异步I/O框架,提供了一个统一高效的模型,同时支持TCP、UDP以及Pipe,并能够方便的在异步和同步操作之间进行切换。目前其实现是基于Java NIO,并计划通过JNI来支持各操作系统上本身提供的异步I/O功能,应用可以方便的通过运行期属性来方便的切换到更为高效的实现上。[13] Java NIO包虽然提供了非阻塞I/O模型,但是直接使用NIO的非阻塞I/O需要成熟的网络编程经验,处理众多底层的网络异常,以及维护连接状态,判断连接超时等等。对于关注于其业务逻辑的应用而言,这些复杂性都是不必要的。不同Java版本的NIO实现也会有一些Bug,Cindy会巧妙的绕开这些已知的Bug并完成相应功能。并且NIO本身也在不断发展中,Java 1.4的NIO包中只实现了TCP/UDP 单播/Pipe,Java 5.0中引入的SSLEngine类使得基于非阻塞的流协议(TCP/Pipe)支持SSL/TLS成为可能。使用Cindy,应用可以在同步和异步之间进行无缝切换,对于大部分操作是异步,可某些特殊操作需要同步的应用而言,这极大的提高了易用性。[14]

1.服务器端编码:

SessionAcceptor acceptor ;

acceptor=SessionFactory.createSessionAcceptor(SessionType.TCP); acceptor.setListenPort(port); //设置监听端口 port为端口号

acceptor.setAcceptorHandler(new SessionAcceptorHandlerAdapter());

//设置SessionAcceptorHandler;

SessionAcceptorHandler接口是处理SessionAcceptor产生的各种事件, SessionHandler接口则用于处理Session产生的各种事件。

acceptor.start(); //开始执行,服务器开始监听TCP连接。SessionAcceptorHandlerAdapter类是处理acceptor时间的接口,里面包括了各种方法,我们主要使用到对象接收事件(objectReceived),我们接受到对象以后再对其进行处理。代码如下:

new SessionAcceptorHandlerAdapter(){

public void sessionAccepted(SessionAcceptor acceptor, Session session) throws Exception {

session.setPacketEncoder(new SerialEncoder());

session.setPacketDecoder(new ServerPacketDecoder());

session.setSessionHandler(new SessionHandlerAdapter(){

public void objectReceived(Session session, Object obj){

/****这里可以得到接受到的对象,我们封装成Message类****/