即时通讯软件的设计与实现
- 格式:doc
- 大小:458.50 KB
- 文档页数:11
即时通讯软件的设计与实现
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类****/