一个简单的即时通讯工具的设计与开发

TrueLove

发布日期: 2019-01-28 08:59:59 浏览量: 1496
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

摘 要

即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能。Java是当前比较流行的开发语言之一,它有着自己的易用特点与性能优势,比如跨平台、安全性、多线程、网络Socket编程、数据流概念等方面,因此通过对开源即时通讯LinuxQQ的研究和分析,基于Java语言和J2EE规范设计了一个即时通讯工具JICQ (Java for I seek you),并对其体系结构、构成模块及系统关键技术进行了分析与设计。在系统设计与建模过程中,使用了UML和面向对象的分析、设计方法,并使用Rose作为建模工具;本系统基于j2se1.5,j2ee1.4,使用Eclipse等作为开发工具,在开发过程中用到了时下流行的重构开发方法,优化了系统的设计。力图使系统具有安全、高效、实用、支持在不同系统平台运行等特点。

关键词:即时通讯;多线程;SOCKET编程;JSP

1 系统体系结构的设计

1.1 需求描述

伴随着当今互联网的迅速发展,人们之间的信息交互的实时性能变得越来越重要,传统的电子邮件交互已经不能够满足人们的即时通讯要求,鉴于此种情况打算开发出一款类似于腾讯QQ的即时通讯软件,只要经过注册你便可以获取一个帐号,通过该帐号你可以在客户端登陆,成功登录后便可以在互联网上与你的亲朋好友进行畅谈,由于技术和时间问题,该软件主要提供私聊、群聊、好友管理、群管理等常用功能,其它一些功能比如文件传输、语音聊天和视频聊天等功能,由于技术问题暂时没有实现,可以在该系统的基础上实现这些功能,也可以在此基础上进行更多功能的扩展。

1.2 系统架构设计

该系统主要包括三层,客户端,服务器端,以及数据库服务器,客户端用来提供用户的登录,服务器端用来对登录的用户进行管理以及用来处理信息之间的转发,数据库服务器主要存放一些重要的信息。它们之间的关系如下图所示:

中间层又分成四个部分:

1.3 系统的总体功能设计

1.3.1总体功能设计

根据上述需求的描述,对该系统按照功能进行了模块的细化,主要包括注册登录、好友聊天、好友组管理、群聊天4个模块,还有很多其它小模块,这4个模块是实现该系统的核心模块,模块之间的耦合程度非常低,其中注册模块是通过B/S结构来实现,不需要安装客户端。下图是上述的4个重要模块的用例交互图。

1.3.2注册模块设计

注册模块是整个系统的最基础模块,该模块主要通过B/S模式来实现,技术上采用J2EE的三(N)层结构,它有以下特点:

​ 1.能有效降低建设和维护成本,简化管理;

2.适应大规模和复杂的应用需求;

3.可适应不断的变化和新的业务需求:

4.访问异构数据库;

5.能有效提高系统并发处理能力;

6.能有效提高系统安全性

该模块表现层主要用的技术是Jsp和servlet,后台数据库用的是Sql 2000数据库。该模块主要包括以下功能:帐号注册、密码的找回、密码的修改以及个人信息的查询。通过该模块,用户可以与Web服务器交互进行号码的注册、密码找回等功能。

下边是用户注册与Web服务器之间的用例交互图。

下边是用户注册的活动图。

1.3.3 登录模块设计

该模块主要给注册成功的用户提供一个登录界面,用户根据自己注册的帐号信息可以与服务器交互,如果提供的信息通过服务器的验证便可以成功的登录系统,成功登录系统之后,可以进行一些操作,比如和好友聊天等,使用该模块之前必须安装一个客户端。登录模块只是一个简单的页面,主要填写用户名、密码之类的信息,登录成功后的主界面包含了系统的大部分功能,比如添加和删除好友、添加和删除好友分组、和朋友聊天等功能。下图是登录模块的用例图。

下边的登录模块的活动图,主要是对用户提供的用户名和密码提供验证。

下边是用户之间交互信息的时序图,主要包括从用户登录到通过验证然后进行信息的发送,给好友发送信息包含两种情况,第一,如果好友在线的话消息直接通过服务器中转发送给好友,如果对应的好友不在线,则讲发送的信息保存到数据库中,当该好友上线的时候从数据库中读出相应的信息进行发送。

1.3.4用户间交互模块设计

该模块主要实现已用户之间的信息交流,用户交流的前提是先要添加好友,可以通过查找功能进行好友的查找,找到要添加的好友后,通过发送好友申请消息来添加好友,当对方通过添加好友的验证消息后,便可以成功的添加好友。只有成功的添加好友之后,才可以进行用户之间的信息的相互交互。下边是用户交互的用例图。

用户之间聊天的信息主要通过聊天服务器进行中转,用户之间聊天内容主要存储在客户端的一些文件中,可以通过查看聊天功能来进行对这些聊天信息的读取。下图是用户交互的活动图:

下边是好友添加的时序图:

2 系统实现

2.1 网络通讯编码实现

2.1.1 聊天客户端部分代码

下边是聊天客户端的核心代码,它用来判定消息的来源以及针对该消息所进行的相应的操作。

  1. for(int i=0;i<MyPersonTree.alist.size();i++) //判断是哪个好友发来的信息
  2. {
  3. p=(Person)MyPersonTree.alist.get(i);
  4. if(p.getID().equals(hisJICQ))
  5. break;
  6. else p=null;
  7. }
  8. if(p!=null) //队列中有该好友
  9. {
  10. JICQChatFrame jchatExist=null;
  11. int isExistFrame=0;//判定聊天窗口是否已经打开
  12. for(int i=0;i<MyPersonTree.vector.size();i++) //遍历向量
  13. {
  14. jchatExist=(JICQChatFrame)MyPersonTree.vector.get(i);
  15. if(jchatExist.JICQ.equals(hisJICQ))
  16. {
  17. isExistFrame=1;//聊天窗口已经打开
  18. break;
  19. }
  20. }
  21. if(isExistFrame==0)//聊天窗口没有打开,新建一个窗口
  22. {
  23. JICQChatFrame jchat=new JICQChatFrame(p,this);
  24. MyPersonTree.vector.addElement(jchat);
  25. jchat.setMessage(headmsg,msg);
  26. }
  27. else
  28. {//在聊天窗口中显示该信息
  29. jchatExist.setMessage(headmsg,msg);
  30. }} else
  31. {
  32. JICQChatFrame jchatExist=null;
  33. int isExistFrame=0;
  34. for(int i=0;i<MyPersonTree.UnKonwVector.size();i++) //陌生人的信息
  35. {
  36. jchatExist=(JICQChatFrame)MyPersonTree.UnKonwVector.get(i);
  37. if (jchatExist.JICQ.equals(hisJICQ))
  38. {
  39. isExistFrame=1;
  40. break;
  41. }
  42. }
  43. }

2.1.2 服务器端监听与转发消息代码

下边是服务器端的监听程序,如果发现有socket连接,就创建一个与该连接所对应的一个线程,该线程主要用来处理用户之间的信息交互。

  1. public void run()
  2. {
  3. try
  4. {
  5. while(true) //始终监听状态
  6. {
  7. Socket client=listen.accept();
  8. //创建用户线程
  9. PersonThread f=new PersonThread(client);
  10. f.setPriority(Thread.MIN_PRIORITY);
  11. f.start();
  12. }
  13. }
  14. Catch(IOException e)
  15. {
  16. System.err.println("Erro:"+e);
  17. System.exit(1);
  18. }
  19. }
  20. //服务器端的消息转发函数
  21. public static void broadcast(String msg,String hisJICQ)
  22. {
  23. int i;
  24. PersonThread you;
  25. for(i=0;i<connections.size();i++)
  26. {
  27. you=(PersonThread)chatserverthree.connections.elementAt(i);
  28. if(you.JICQ.equals(hisJICQ))
  29. you.send(msg);
  30. }
  31. }

2.1.3服务端单线程上线处理代码

下边是服务器端上的单线程的处理代码,主要通过网络流来读取客户端发送的消息,然后将消息分解,用来区分消息的类型,譬如是群消息还是个人消息等。

  1. While(true)
  2. {
  3. line=in.readUTF(); System.out.println(line);
  4. //将读取的信息按照特定格式进行拆分
  5. StringTokenizer stk=new StringTokenizer(line,"#"); //PEOPLE+"#"+JICQ
  6. if(stk.hasMoreElements()) key=(String)stk.nextElement();
  7. //用户上线提示
  8. if(key.equals("PEOPLE"))
  9. {
  10. try{ String JNUM=(String)stk.nextElement();
  11. this.JICQ=JNUM;
  12. for(int i=0;i<chatserverthree.connections.size();i++)
  13. {PersonThread tt=(PersonThread)chatserverthree.connections.get(i); if(tt.JICQ.equals(this.JICQ))
  14. {
  15. chatserverthree.broadcast("RELOG#YES",tt.JICQ);
  16. chatserverthree.connections.remove(i);
  17. tt.stopThread();
  18. break;
  19. }}
  20. //将该线程加入到线程向量中
  21. chatserverthree.connections.addElement(this);
  22. Friends f=new Friends();
  23. ResultSet rs=f.selectAddMePerson(JNUM);
  24. ArrayList flist=new ArrayList(50);
  25. while(rs.next())
  26. {
  27. flist.add(rs.getString(1));
  28. }
  29. for(int i=0; i<chatserverthree.connections.size();i++)
  30. {
  31. PersonThread pt=(PersonThread)(chatserverthree.connections.elementAt(i));
  32. if(flist.contains((String)pt.JICQ))
  33. {
  34. chatserverthree.broadcast(line,pt.JICQ);
  35. }}
  36. s_MyDetails sMy=new s_MyDetails();
  37. //从信息表中读取离线信息,然后将之删除
  38. ResultSet rsMessage=sMy.isHaveMessage(JNUM);
  39. if(rsMessage!=null)
  40. while(rsMessage.next())
  41. {
  42. int FriendJICQ=rsMessage.getInt("FriendJICQ");
  43. int MyJICQ=rsMessage.getInt("MyJICQ");
  44. String msgHead=rsMessage.getString("MessageHead");
  45. String msgBody=rsMessage.getString("MessageContent");
  46. int flag=rsMessage.getInt("flag");
  47. String Allmsg="";
  48. if(flag==1)
  49. Allmsg="MSGONE#"+FriendJICQ+"#"+MyJICQ+"#"+msgHead+"#"+msgBody; else Allmsg="ADDFRIEND#"+FriendJICQ+"#"+MyJICQ+"#"+msgHead+"#"+msgBody;
  50. chatserverthree.broadcast(Allmsg,JNUM);
  51. } sMy.delOldMessage(JNUM); } }

2.2 系统运行的效果图

2.2.1 登录界面

该界面提供用户输入自己注册号码和相应的密码,然后登录系统,如果还没有注册帐号,可以点“申请”进行帐号的申请。如下图所示:

2.2.2 主界面

登录成功后的主界面,主要是一些好友的信息,以及一些好友分组的信息,在此界面上可以进行好友的添加、查找、删除,以及好友组的添加、删除,同时还可以查看最近联系人等功能。

2.2.3 群聊天界面

如果你已经成功的加入该群,你就可以在群中和其他群成员进行一些信息的交互。

2.2.4 好友聊天界面

该界面主要是用户聊天的主要界面,主要提供了发送和接受聊天信息功能,以及查看聊天记录,同时还可以查看好友的一些基本信息。

2.2.5 好友查找界面

好友添加和查找的界面,你可以根据不同的条件来进行好友查找的筛选,比如只查找在线的用户或者可以查看所有用户,还可以根据一些信息讲查找范围缩小,比如根据用户的性别 年龄等信息进行查询,以满足自己的查找需要。

参考文献

[1] 冯博,应群.面向对象的JAVA网络编程[M].北京:清华大学出版社,

[2] Bruce Eckel[美].java编程思想[M].陈昊鹏译.北京:机械工业出版社

[3] 特罗特[美].设计模式解析[M].徐言声译.北京:人民邮电出版社

[4] 王少峰.面向对象技术UML教程[M].北京:清华大学出版社

[5] 结城浩[日].java多线程设计模式[M].博硕文化译北京:中国铁道出版社

[6] 核心研究室.深入浅出JavaSwing程序设计[M].北京:中国铁道出版社

上传的附件 cloud_download 一个简单的即时通讯工具的设计与开发.zip ( 3.07mb, 62次下载 )
error_outline 下载需要11点积分

发送私信

放空的心,是最好的礼物;独走的路,是最美的风景

9
文章数
14
评论数
最近文章
eject