网站地图>收藏本站>设为首页
定做流程>服务项目>价格参考>付款方式>诚邀加盟>关于本站>联系我们
当前位置:5173毕业设计论文网文章资讯VC

JAVA聊天工具制作类似icq|QQ的聊天系统程序设计

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2010-03-27 16:07:00
QQ交谈在线咨询详情 5173论文网竭诚为您服务 本站永久域名:www.lw5173.com

3   软件功能与界面需求

提供基于TCP/IP网络的即时消息传送、消息广播、实时聊天、文件传输等功能。 具体列举如下:

·                     支持多账号

·                     可以同时发送同一个消息给多人,通过输入这些人的号码列表或姓名列表

·                     可以同时发送一个消息给所有好友

·                     有权限的人可以向所有用户发送消息广播,便于消息的发布

·                     即使用户不在线,也能通过服务器发送离线消息

·                     提供消息、聊天的历史记录,方便对信息的查看和管理

·                     提供查看在线的人的功能

·                     提供按ID或姓名查找用户的功能,添加用户方便

·                     小窗口显示,不占用屏幕很大的空间,

·                     支持热键调出后台的应用程序。

·                     应用程序运行后,在任务栏右边生成一个图标,单击弹出在线状态     菜单,双击显示应用程序窗口,右击弹出主菜单。

·                     支持隐身登陆,可以看到在线的朋友,朋友却不知道你上线了

·                     可以实时显示用户的状态和随时改变自己的状态

·                     提供了自动弹出消息

·                     好友上线通知

·                     好友下线更新

·                     有权限的人可以发系统广播(或在服务器上发)

·                     查看好友信息

·                     按姓名或号码查找某人

·                     在好友列表中删除某人

·                     可以选择在某人的好友中删除自己

·                     更改个人信息

·                     系统设置

·                     给在线好友传文件

·                     消息管理器

·                     在程序中设定最大,最小窗口尺寸(宽度,高度)

·                     主窗口总是浮在最上端

·                     速度快,占用资源少

 

4   概要设计和详细设计

 

本章将论述软件系统的面向对象设计过程。用Visual C++语言在Windows环境下编程实现。

 

§4.1总体设计概述

采用客户端——服务器模型,使用从MFC类中的CAsyncSocket类的派生类进行实现底层通讯,底层利用UDP数据报协议进行通讯,这样,便于客户端之间的直接通讯,也可以高效的传送消息。因为使用UDP协议进行通讯,所以要自己控制其可靠性。我每发送一个数据,接受方接受到数据后,会发回一个响应信息,发送方在一个超时时间内,收到响应信息,就表示发送数据成功,若没有收到,就表示发送失败,会按用户指定的次数N,重试N次,如果N次都失败,就返回发送数据失败。当然,发回来的确认信息也可能丢失,但确认信息很短,相对来说,丢失的机率会小一些,是一个折中的办法。

 

为了保存用户信息和好友信息及一些相关数据,服务器使用到数据库技术。服务器的数据库采用的是ODBCACCESS数据源,服务器访问数据库,用的是MFC中的CDatabaseCRecordset,因为,对数据库的操作简单,服务器端,我只要功能,不需做界面,所以使用Sql语句直接访问数据库,已经足够满足要求了。

 

服务器运行的流程为:

服务器运行后,开启服务,则服务器开始侦听用户请求,如有信息发送过来,首先,发送回确认信息,然后,建立一个线程,处理接受到的数据。在线程里,按照接受到数据的类别,进行相应的处理,如有需要,会向用户发送处理的结果,或成功或失败的消息,处理结束后,线程就结束了。这样,可以实时接受每个用户的请求,不会因为处理一个用户的请求,而忽略了其它用户。

 

服务器端主要是为用户存储必要的信息,协调用户之间的通讯,服务器端的设计,主要在功能上面。服务器端的设计和底层通讯的方法,将是我讲述的重点。

 

客户端的运行流程为:

若有本地用户信息,则取出本地用户信息,显示登陆窗口,若没有,则显示用户注册窗口(在登陆窗口里,也可以选择用户注册)。登陆时,可选择是否隐身,进入系统后,好友列表中,在线的人,将以高亮度显示,并处在列表的上头。不在线的人,将以灰色显示。登陆后,如果有的话,服务器会发来好友给你发送的离线消息或广播消息。如果有好友上线了,就会通知你,好友下线了,你也可以在好友列表中看到,你可能接受到别人给你发送的消息,或广播消息等。根据用户的操作,可以向好友发送消息,查看好友信息,查看在线的人,查找用户,发送广播消息等等功能。

 

客户端主要是提供给用户一个友好的用户界面,方便用户操作,客户端主要负责从服务器上得到数据后,显示给用户。从服务器得到好友的IPPort后,就可以直接与好友进行通讯,聊天等等。客户端主要是界面的设计(除了底层通讯的以外),根据不同的要求,向服务器发送各种类型的请求。然后等待服务器的响应。客户端的界面的设计很繁琐,没有详细介绍的必要,所以,我的重点,将放在服务器的设计上。客户端只是简要的说明一下。

 

 

§4.2服务器数据库的设计

 

服务器数据库设计的要求是要能够满足客户端的需求,保存用户信息和用户好友信息,提供离线消息的服务,和发广播消息的服务等。总共有五个表:

用户信息表(Users)好友信息表(Friends)广播消息表(Broadcast)离线广播表(OffBroadcast)离线消息表(OffMsg

 

用户信息表(Users

主键: UserId

UserId       自动编号            4字节长整形

Id           用户帐号            4字节长整形

Photoid      用户的图象编号      4字节长整形

password     用户登陆的密码      字符串

name           用户的姓名          字符串

sex          用户的性别       单字节整形 0   1   2 未知

age         用户的年龄     字符串 (为了适应不愿填写此项的人)

canbeadd    能否被人加为好友

//单字节整形 (0,1,2 不能被加入,允许被任何人加入,需要身份验证)

email        电子信箱        字符串

homepage    个人主页        字符串

address      地址            字符串

phone       电话            字符串 

fax          传真           字符串

department    部门           字符串

description    个人简介       字符串

 

好友信息表(Friends

主键:Num

Num       自动编号           4字节长整形

MyId       自己帐号          4字节长整形

FriendId     朋友帐号          4字节长整形

 

广播消息表(Broadcast

保存发送的广播消息

主键:MsgId

MsgId      自动编号           4字节长整形

SendTime    发送时间          4字节长整形

SenderId     发送者的帐号      4字节长整形

Msg        发送的消息         备注类型

 

 

离线广播表(OffBroadcast

保存那些还没有发送广播消息的用户

主键:Num

Num       自动编号           4字节长整形

RecvId     接受者的帐号       4字节长整形

MsgId      广播消息号        4字节长整形 (对应广播消息表的MsgId

 

 

离线消息表(OffMsg

保存用户之间发送的离线消息

MsgId     自动编号      4字节长整形

RecvId     接受者的帐号       4字节长整形

SenderId   发送者的帐号      4字节长整形

RecvTime    接受的时间     4字节长整形

nIndex     发送消息的类型    4字节长整形

Msg       发送的消息         备注类型

 

 

§4.3类设计的总体结构

 

服务器的类总体结构:

 

一.主应用程序类

CServerApp

包含全局的数据结构

 

二.传送信息类

CData,CMsg1,CMsg2,CMsg3,CMsg4,CMsgChangePI,CMsgModifyPwd, CMsgOnlineFriend,CMsgPerson,CshowOnlinePeople

处理传输数据

 

三.SOCKET通讯类

CServerSocket,   CSendSocket,   CRecvSocket

处理底层通讯的类,与外部的接口是CserverSocket类,提供了一个简单的接口

 

四.其它类

CMainFrame,CServerDoc,CServerView,CSetupDlg,CAboutDlg

UserInfo结构存储在线人的信息

 

 

客户端的类总体结构:

 

一、应用程序类

CClientApp

包含全局的数据结构

 

二、传送信息类

CData,CMsg1,CMsg2,CMsg3,CMsg4,CMsgChangePI,CMsgModifyPwd, CMsgOnlineFriend,CMsgPerson,CshowOnlinePeople

处理传输数据

 

三.SOCKET通讯类

CClientSocket

处理底层通讯的类,提供了一个简单的接口

 

四.用程序框架类

CmainFrame

处理用户界面和一些接受数据的响应,主要的处理过程都在这个类里实现。

 

五.对话框类

CfriendDetailDlg   显示用户详细信息的对话框类

CloginDlg       显示登陆窗口的对话框类

ClookDlg        显示查看消息的对话框类

CregisterDlg      显示注册窗口的对话框类

CsetupServerDlg   修改服务器设置的对话框

CtalkDlg         显示发送消息对话框的类

CshowBroadcastDlg   显示广播消息的对话框

CshowAddMsgDlg    显示被加为好友的信息的对话框

CmultiSendDlg     通过姓名或ID列表的向多人发送信息的对话框

CsendBroadcastDlg   发送广播消息的对话框

CsendToAllDlg      向所有好友发送消息的对话框

CModifyPIDlg      修改个人信息的对话框

 

六.界面类

CGfxGroupEdit,CGfxOutBarCtrl,CGfxPopupMenu

实现像OutBaroicq样式的那种滚动分栏的界面类,从Internet,上获得的源代码,通过修改一些接口,使之更适合我的应用。提供了一个漂亮的界面。

5   全文总结与工作展望

 

§5.1 全文总结

本文重点讨论客户端/服务器的程序的设计方法和过程,对整个系统进行了详细设计,利用面向对象的方法,进行整个系统的设计。

本文主要做了以下工作:

列举了网络寻呼软件的系统和界面需求。

陈述了客户端/服务器程序的设计原理和过程

根据系统需求,进行整个系统的各个部分的详细设计。

 

§5.2 工作展望

本文主要是对本软件服务器端的设计作了比较详细的介绍,并对服务器端进行了初步的开发。而客户端的设计有很多都需要完善。客户端是给用户使用的,从方便和美观上,还都还有很多需要完善的地方。而且,由于时间关系,客户端还有些功能没有完全。如果要使本系统成为一个实际应用系统并在局域网上实际应用,除了完成客户端的功能外,笔者认为还应做以下的完善和开发工作:

⑴ 进一步完善底层通讯协议,使能够更好的处理数据的发送和接受。

⑵ 多线程下的对临界数据访问的问题。

⑶ 对发送的数据,进行一定的加密措施,使之更加安全可靠。

⑷ 对本地用户的密码的加密问题,在本程序中,没有对本地密码进行加密。

在客户端系统,功能的设置有待进一步丰富,功能的实现还有

待完善和改进。

⑹ 在客户端处理中,响应从服务器发来的数据,是在主线程里执行的,所以,当接受数据忙时,就会出现没有响应的情况。进一步考虑,如何能改善这种情况。

6   附录

 

§6.1 查错日志

 

四月十五日

编写socket的程序,必须在程序启动初始化时调用AfxSocketInit()函数,否则,使用socket通讯,将得不到任何结果,没有任何响应

 

四月十八日

*((DWORD*)m_szResponse+m_nrLength)=pData->This;

中,少加一个括号,使响应信息回应不正确:浪费130的时间。

shall be :  *((DWORD*)(m_szResponse+m_nrLength))=pData->This;

 

四月二十一日

虽然说,为了很编译加快,最好不要头文件中包含头文件,但:

1。如果从一个自己写的类进行继承,则必须包含此类头文件

2。注意,每个实现文件,都要包含Stdafx.h

 

四月二十五日

记住,在SQL 语句中,字符串要用' ' ,单引号,使用””双引号,访问数据库将提示SQL错误

 

四月二十八日

取数据库中的字符串数据时,如果用普通方法

msg.name=*(s1.m_pstring);

如果此字符串为空,则会出异常,

解决方法:

如果是字符串,可用  rs.GetFieldValue(3,msg.name);  or

if(s1.m_pstring!=NULL)msg.name=*(s1.m_pstring);

 

五月八日

if(i==m_nSendMaxIndex)

       while(!m_aSendData[m_nSendMaxIndex])m_nSendMaxIndex--;

should be

while(!m_aSendData[m_nSendMaxIndex]&&m_nSendMaxIndex>0)m_nSendMaxIndex--;

否则,将使m_nSendMaxIndex减为负数

 

五月十日

DWORD This=*(buff+nRead-4);

与是有很大不同的,下面一个才正确。上一个取出一个字符数据,然后转化为DWORD赋值给This

DWORD This=*((DWORD*)(buff+nRead-4));

查这个错误,花了2小时,

客户端/服务器程序不大好调试,两个都得运行,一起调试,而且还是多线程的,总之调试起来使麻烦。

 

五月十五日

今天是最糟的一天,全天都在查错,修改一个地方,可能会有许多地方都被牵连到了,都需要修改,在修改时,不免又出现了新的错误,这真是个大问题。

发现了一个非常奇怪的问题,只是一个非常简单,非常。。。。。

忘记写break;

 

五月十七日

我今天把底层通讯的检查回应消息是否回来的算法修改了。

以前的算法是:

有一个缓冲区,发送一个数据,就把发送这个数据的内存起始地址存在这个缓冲区中,当回应消息发回来时,就是这个缓冲区中找,找这(This)与这内存地址相同的,就把它赋为0,发送程序若在这个缓冲区中没有找到这个内存地址,就表示数据发送成功,找到了,就表示还不成功。

现在想来,这个算法即麻烦,又易出错,真不知当时是怎么想的。

现在的算法是:

设一个缓冲区长度为N,然后,为每一次数据进行统计,发一次,就加1,然后把发送数据中的This=count%N,且把缓冲区中第This个成员设为0,在发送端,就要数组中的第This个成员是否为1即可,在接受到的确认信息中,取出This项,再为缓冲区中第This项设为1,这样就可以快速且可靠的判断发送数据是否得到响应回来了。

 

五月二十日

今天发生了一个怪事,我在调试程序时,发现在,不能在服务器的消息处理消息和OnTimer里面写发送数据的代码,否则,怎么都发送不成功,

好像它是非得此消息处理函数或OnTimer执行完毕,才让其它线程运行,我的发送函数,总是得不到正确结果,我一度怀疑我的底层通讯算法的合理性。后来,我也不知道如何解决,感觉是一个无法逾越的问题,非常失落…………………………………………

晚上,当我重新拿起来的时候,试了试,又觉得这不是不可逾越的问题,只要回避那种情况,就可以了。

我把在OnTimer里处理的事情放在一个线程里去做,完成同样的功能,现在,检查人是否仍然在线的函数,现在终于又成功了。真是太高兴了。

可是,我可能没有足够的时间来完成这个程序了。真可惜。我必须开始写论文了,否则,我将无法完成任务。

 

五月二十一日

今天,查到用LoadImage()函数,可以读取存在磁盘上的图象文件,客户端显示的头像的问题,终于可以解决了。可是又遇到了问题,我有32x3216位色的图象,显示时,不知道如何使其透明背景色,因为图象有背景色,所以显示时,看上去无法与背景一样的颜色,而且,我不知道如何由32x32的图象列表,得到相应的16x16的图象列表,因为我需要以小图标的样式显示。我该如何做呢?有人帮我就好了。

 

五月二十二日

在客户端,我的界面用的是在网上找到的一个源代码

CGfxOutBarCtrl类,可以实现象OutLookOicq的那种滚动的分栏条,今天终于看懂了接口部分代码,可以随意更改为我用了。

 

五月二十四日

今天,我终于明白五月二十日的情况的原因了。

原来,OnTimer也是系统在定时器时间到了,向系统发送的一个消息WM_TIMER,进入消息队列,而CasyncSocket类的OnReceive事件,也是window发送的一个消息进行触发的,所以,正在处理一个消息(比如说菜单响应或OnTimer或命令按钮等)时,当然不可能去处理消息队列中的另一个消息了。看来这个底层通讯的算法,在客户端,是无法适用了,而在服务器端,因为所有的发送数据都在线程里面,所以,用这种算法,还是很不错的,对服务器适用。总算不是一无是处,我需要改进在客户端的底层通讯的算法了。

 

五月二十六日

今天把客户端的底层通讯改进了一下,添加了一个SendDataInThread函数,让它在线程里发送数据,通过向指定窗口发送消息来反馈信息。这样,需要直接发送消息,不需检验时,就可以使用SendData函数,需要检验时,就可以使用SendDataInThread函数。

 

五月二十七日

客户端在启动时,响应很慢,特别是有离线消息发送过来时,客户端要有2秒的时间无响应,而且,有时,服务器一个数据,发回几次。可能等待的时间(超时时间太短了),修改了一下超时时间的参数,情况好了一点。

 

五月二十八日

对昨日的情况,我对服务器端进行了一点修改,因为主要是在上线时,发生这种无响应的情况,我在服务器端发送数据时,每发送一次数据后,我就让该线程Sleep(K)一段时间,让客户端有足够时间去处理接受到的数据,这样,就缓解了客户端的情况,使用通讯趋于正常。

 

§6.2设计中遇到的问题

由于原先的底层通讯算法不适合于客户端使用,在多次失败后,在客户端,对底层通讯算法进行了扩充。

1.    客户端/服务器程序的调试,两个程序得一起运行,一同调试,有很多的不便的地方,特别是涉及到多线程的。

2.    每写100行代码,平均会出现14个编译错误,当然大部分为笔误。1-2个逻辑错误。一度因为无法很快定位到逻辑错误的地方,跟踪程序花了大量的时间与精力,无法继续设计下去。

3.    我有32x32的图象列表CimageList,我需要得到对应缩小了的16x16的图象列表,直到现在,还不知道如何实现。

4.    我的头像是16位色的,无法使用LoadImage里的使用透明方式读取图象,我怎样可以得到让它去掉背景色的图象显示?

5.    VC中不知道如何在下拉列表框中显示图象列表,所以,我的个人资料中,没有实现头像的显示与选择

6.    由于可能由于客户端响应慢的原因,有时,服务器向客户端发送一次以上的同一数据。是否在线程里处理会更好一些呢?

7.    用什么函数,可能得到本机的IP地址?

8.      消息的存储格式,有各种不同的消息,应以何种方式存储为好

9.      如何在程序打开ODBC配置的程序?

 

[1]     官章全等 VC60高级编程范例》 电子工业出版社 2001.1

[2]     张海藩.  《软件工程导论》清华大学出版社1998

[3]     谢希仁.  《计算机网络》 电子工业出版社. 1999.4

[4]     王国印 .Visual C++TM 技术内幕(第二版) 清华大学出版社. 1996.5

[5]     David Bennett  徐军 等译. Visual C++5 开发人员指南.  机械工业出版社.

[6]     木林森 .  Visual C ++ 5.0 使用与开发.  清华大学出版社.

[7]      汪成为 .  面向对象分析、设计及应用.  国防工业出版社. 1992

[8]      张海藩.  软件工程导论. 清华大学出版社. 1998.3

[9]      谭浩强.  C程序设计.  清华大学出版社. 1994

[10]  卢有杰 .  C语言高级程序设计.  清华大学出版社. 1992

[11]   汪成为 .  面向对象分析、设计及应用.  国防工业出版社. 1992

 

目录

1   概论

§1.1 课题的来源及意义 …………………………………………… 1

§1.2 网上寻呼的软件的现况……………………………………… 1

§1.3 面向对象方法与设计简介…………………………………… 2

§1.4 本章小结………………………………………………………… 3

2   网络通讯程序的设计原理和过程

§2.1 TCP/IP协议 …………………………………………………… 4

§2.2 客户/服务器程序的设计 …………………………………… 6

3   软件功能与界面需求…………………………………………… 9

4   概要设计和详细设计

§4.1总体设计概述……………………………………………………10

§4.2服务器数据库的设计 …………………………………………11

§4.3类设计的总体结构 ……………………………………………13

§4.4服务器端的常量定义 …………………………………………15

§4.5客户端的常量定义 ……………………………………………17

§4.6服务器端的底层通讯类的设计………………………………21

§4.7客户端的底层通讯类的设计…………………………………23

§4.8客户/服务器之间的通讯的数据类的设计 ………………25

§4.9发送数据的确认消息的编码方案 …………………………30

§4.10服务器端的分配用户帐号的策略…………………………31

§4.11 服务器的应用程序类CServerApp的设计 ……………31

§4.12 客户端的应用程序类CClientApp的设计 ……………33

§4.13服务器端检查用户是否仍然在线的算法 ………………34

§4.14服务器端处理用户请求的算法……………………………35

§4.15客户端处理服务器发送来数据的算法 …………………40

5   全文总结与工作展望

§5.1 全文总结…………………………………………………………42

§5.2 工作展望…………………………………………………………42

6   附录

§6.1 查错日志…………………………………………………………43

§6.2设计中遇到的问题 ……………………………………………46

参 考 文 献…………………………………………………………………


以上内容只是毕业设计作品的部分资料介绍,如果了解更多详情请联系客服QQ:57510459
     购买帮助>>

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论