当前位置:文档之家› 即时通讯软件的设计与实现

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

即时通讯软件的设计与实现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表2.2 用户关系表用户关系表是用来保存用户之间的好友关系的数据表,查询好友列表的时候要从此表中查询与自己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类****/Message message=(Message)obj;}}2.服务端编码首先先生成一个TCP的Session,然后为session设臵远程IP地址,最后通过设臵SessionHandlerAdapter()来处理事件。

Session session=SessionFactory.createSession(SessionType.TCP); session.setRemoteAddress(new InetSocketAddress(address,port)); session.setPacketEncoder(new SerialEncoder());session.setPacketDecoder(new SerialDecoder());session.setSessionTimeout(0);session.setSessionHandler(new SessionHandlerAdapter());3.2 用户登录的具体实现前面介绍了Cindy的网络框架,现在我们来演示用户登录时候的流程。

用户登录请求处理模块是用户通过了验证(验证过程在信息查询服务器上完成),取得了合法登录密钥之后,登录文字通讯服务器的第一步。

用户登录请求处理模块的处理过程是:接收用户登录请求,首先判断其登录密码是否正确(登录密码是用户注册时候输入的口令,服务器收到该请求后,首先查询数据库中此用户ID的密码,然后判断和用户发送的登录密码是否一致)。

如密钥不正确则关闭该连接,并发送密码错误的信息。

如果密钥正确,则修改该用户在数据库中的IP 记录,并从数据库中读取出其所有的好友列表,并将此用户上线的消息发送给其好友,服务器同时将此用户此时此刻登录的情况记录在日志中。

客户端收到密码验证正确的消息之后,会受到服务器发送来的好友列表和详细信息,并通过这个好友列表构建好友信息,完成登录。

在客户端中,我们提供了隐身上线,和保存密码两个选择项,其内容保存在Hitayo.ini文件中。

在登录窗口中,可以手动输入服务器的IP 地址,并将新的服务器地址保存进服务器选择列表,下次登录时,可以自动选择到上次登录的服务器地址,同时还具备检测服务器是否畅通的功能。

登录窗口界面如下:图4.3 客户端登录界面3.3 聊天模块的具体实现一款即时通讯软件,最基本的功能莫过于即时聊天功能。

在本系统中,对聊天信息重新封装(ChatSeria类),使系统的聊天功能支持对文字的字体、大小、粗细、颜色进行设臵,还能够在文字中插入图片,并能支持快捷键,用Ctrl + Enter可以发送消息。

图4.4 聊天窗口界面实现功能的关键在于对聊天信息封装和对文字中图片的定位和还原,以下代码实现了图文混合后对聊天信息的还原:for(int x=0;x<5;x++){end=chat.getMessage().indexOf('?');if(end==0){//获得光标位臵jp.setCaretPosition(jp.getStyledDocument().getLength());jp.insertIcon(new ImageIcon(ImageIO.read(new ByteArrayInputStream(chat.getImage()[x]))));//把图片插入光标位臵chat.setMessage(chat.getMessage().substring(++end));}else{jp.getStyledDocument().insertString(jp.getStyledDocument().getLe ngth(), chat.getMessage().substring(begin, end), null);//插入文字chat.setMessage(chat.getMessage().substring(end));x--;}if(chat.getMessage().indexOf('?')==-1){jp.getStyledDocument().insertString(jp.getStyledDocument().getLength() //插入文字chat.getMessage().substring(--end), null);break;}}其原理是通过重写JTextPane的replaceSelection方法,改变了图标的位臵标记,然后分别保存文本和图片以及字体属性,发送给接受端,接受端接受到信息以后,首先用以上算法,找到图片的标记,再把光标移动到那个位臵,把图片组中的图片插入其中。

最多可以插入5张图片,但是经过测试如果图片过大,可能导致发送失败。

3.4 视频模块的具体实现视频聊天是即时聊天软件发展的一个新的高度,因为IM支持视频聊天是可以必不可少的功能。

JA V A实现对摄像头的控制需要通过JMF多媒体框架。

JMF实际上是Java的一个类包。

JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。

相关主题