仿QQ聊天的毕业论文.doc

上传人:laozhun 文档编号:3934733 上传时间:2023-03-28 格式:DOC 页数:46 大小:714.50KB
返回 下载 相关 举报
仿QQ聊天的毕业论文.doc_第1页
第1页 / 共46页
仿QQ聊天的毕业论文.doc_第2页
第2页 / 共46页
仿QQ聊天的毕业论文.doc_第3页
第3页 / 共46页
仿QQ聊天的毕业论文.doc_第4页
第4页 / 共46页
仿QQ聊天的毕业论文.doc_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《仿QQ聊天的毕业论文.doc》由会员分享,可在线阅读,更多相关《仿QQ聊天的毕业论文.doc(46页珍藏版)》请在三一办公上搜索。

1、北京电子科技学院毕 业 论 文论文题目: 仿QQ聊天软件 班 级: 2009级大专1班 专 业: 计算机信息管理学生姓名: 王阳指导教师: 任慧日 期: 2010年 5月 28日摘 要腾讯QQ是深圳腾讯计算机系统有限公司开发的一款著名的基于Internet的即时通信(IM)软件。它是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,为网络用户提供一个实时交流聊天的平台。仿QQ聊天软件主要是仿照QQ实现用户通过网络相互交流的功能,为进一步开发即时通信技术应用奠定基础。开发此软件的目的是综合以往软件开发知识,进一步熟悉面向对象开发方法,以便得到实用软件开发经验。该系统基本上采用C/S模式实

2、现,其中客户之间聊天采用P2P技术,基于.NET框架,使用SQL Server2005数据库,采用Visual C#2005语言进行编程。本论文将介绍与该系统相关的关键技术,比如套接字Socket,多线程技术等等,重点介绍该系统的相关功能、设计思路,通过相关的插图详细介绍整个系统的开发过程及其实现,并总结开发过程中的经验,分析错误原因,提出解决方案。关键词:即时通信;QQ;聊天软件目 录摘 要第一章 绪论31.1课题背景31.2课题意义31.3研究现状3第二章 关键技术分析42.1.NET42.2Sockets42.3XML技术42.4数据库技术5第三章 系统设计与分析53.1功能分析53.2

3、总体设计93.2.1处理流程93.2.2功能模块133.3详细设计153.4数据库设计40第四章 系统的实现与错误分析404.1系统实现404.2错误分析43第五章 结论44参考文献44致谢45第一章 绪论1.1 课题背景仿QQ聊天软件系统是基于互联网的即时通信软件该系统。即使用因特网技术,允许人们实时的传送信息。即时通信服务的特点是能让用户可以选择性地接受或拒绝某人的信息,也可以同一时间与多人进行交流。当前中国无线互联网呈现出爆发式的增长趋势,移动互联网渐成趋势,即时通信技术已经从PC机向手机媒体渗透 。1.2 课题意义一直以来,空间上的距离都是人们彼此相互交流的最大障碍。缩短彼此之间空间上

4、的距离,使得天涯若比邻,就成了人们迫切的愿望。随着计算机网络技术的发展,人们不再满足仅仅依靠收发电子邮件来进行交流,因此更加即时的直观的使人们能在网上识别在线用户并与他们实时交换消息的即时通信技术应运而生,它是电子邮件发明以来迅速崛起的在线通讯方式,为网络用户提供一个实时交流聊天的平台。而且即时通信和社会化网络、统一通信、在线协同三大技术热点的关系将越来越密切,已经构成融合发展的趋势。在消费者市场,即时通信成为社会化网络的重要支撑性应用;在企业市场,即时通信的普适化应用对企业重视的统一通信和在线协同已经产生重要的影响1,因此即时通信技术的应用将越来越广泛,越来越普遍。1.3 研究现状即时通信的

5、功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能。如今的即时通信服务已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台2。当前即时通信技术和其他技术的关系越来越密切,同时,随着手机互联网的快速发展,即时通信的各个功能逐渐从PC渗透到手机媒体。第二章 关键技术分析2.1 .NETC#.NET是微软公司为NET3平台量身定做的编程语言,它是一种现代程序设计语言,使程序员能够快速地在NET平台上开发种类丰富的应用程序,它继承了c+和Java的语法,去掉了c+中的许多复杂和容易引起问题的东西(比如指针),比起Java。它又多了一些简洁优

6、美的特性。可以说C#.NET 是最适合开发NET应用系统的程序语言。基此原因,本系统采用C#NET4-5-6进行编程开发。2.2 Sockets本系统基本上采用基于Sockets7-8的CS通信系统为了在服务器和客户机之间通过TCP/IP协议通信SystemNetSockets命名空间提供了TcpListener类和TcpClient类。TcpListener类用于服务器上,该类的构造函数定义了服务器监听的端口号。并用Stat()方法启动监听。为了与客户机通信,需要创建一个TcpClient类对象可用TcpListener类的AcceptTcpClient()方法创建一个TcpClient类对

7、象。该方法在建立与客户机的连接之前是禁用的。客户机也使用TcpClient类并用该类的Connect()方法启动与服务器的连接,之后使用与TcpClient类对象相关的流发送和接收数据。服务器启动监听后,如果有客户端连接的信号收到,服务器就自己新建一个Socket,然后再新建个线程用来和需要连接的客户端通讯(以新建的Socket为参数),同时,为了能够使windows窗口响应,还要发送事件给父窗口,接着自己继续侦听。新建的线程执行完毕,自动关闭连接,释放资源。这样,就实现了Socket的连接和多线程通讯。另外使用PostMessage函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队

8、列里,实现消息与指定窗口的绑定。2.3 XML技术在net中提供了一个Dataset类,通过该类的方法能够实现将关系型数据写入一个XML文档,.net中的Dataset类能够绑定关系型数据库的数据表,将关系数据库的平面结构转化为XML的层次结构,通过调用DataSet类的writeXml9方法,可以将数据库中的表写入到一个XML文档中进行保存,并由服务器通过传送XML文件至客户端达到用户与数据库相互交互的目的。2.4 数据库技术数据库选择SQL Server200510。为了实现较快的执行速度,减少网络流量。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行SQL语句。存储过

9、程(Stored Procedure)是一组为了完成特定功能的SQL语句集经编译后存储在数据库中。第三章 系统设计与分析3.1 功能分析仿QQ聊天软件系统的总目标是用户依靠网络服务器提供的服务实现实时聊天,方便人与人之间相互交流。图3-1是客户端用户和服务器管理员的用例图。图3-1 用例图客户端用户具有注册、登陆、实时聊天、查询好友、添加好友、删除好友、更新组、添加组、删除组等功能。服务器管理员具有开启服务、关闭服务、配置服务器的功能。相关UML活动图如下:图3-3 用户注册用例活动图用例名称:注册信息参与执行者:用户,显示器前置条件:系统已开机主事流:1. 用户进入注册页面。2. 用户在注册

10、页面上编辑个人基本信息。3. 系统接收并验证信息是否合法。4. 如果不合法,系统弹出警告框,提示出错。5. 警告过后,返回到1,重新输入。6. 如果注册成功,系统弹出提示框提示注册成功。图2-4 客户服务用例活动图用例名称:客户服务参与执行者:用户,显示器前置条件:系统已开机主事流:1. 用户开打登陆页面。2. 用户在登陆页面上输入登陆信息。3. 客户端初步验证信息是否合法。4. 如果不合法,弹出警告框,提示出错。5. 警告过后,返回到1,重新输入。6. 发送登录信息至服务器验证身份。7. 如果不合法,弹出警告框,提示出错。8. 警告后,返回到1,重新输入。9. 登陆成功,进入主界面。10.

11、用户根据需要选择聊天、查询好友、添加好友、删除好友、更新组、添加组、删除组功能。11. 如果选择聊天,则发送信息至相应好友;如果选择退出系统,则退出系统;如果选择查询好友等其他功能,则发送相应信息到服务器。12. 服务器响应并返回执行情况。3.2 总体设计3.2.1 处理流程注册/登录132678910经网络送服务器程序服务器经网络送来回答26322730283129334544找48友34组36p2p38组42组46友50友19友12找13组16p2p17组18组11能选择用户在线面板373943454749543521友24p2p22组20组23p2p25组14p2p1540友41友图3-

12、1 系统数据流程图下面对各模块(以数字表示)进行功能说明:1、 读入并确定(登录/注册):它是一个事务处理中心,若是注册则转入2 ,登录则转入5。2、 读入注册资料:读取所输入的用户资料,并将数据送3。3、 检验输入资料:检验输入的用户资料,初步检查输入是否有误,它是一个事务处理中心,有误则转2再次读入,检查无误则将数据送4。4、 执行数据库操作:执行SQL Insert语句,添加用户注册资料,将有关执行结果的数据送5。5、 输出注册结果: 弹出对话框显示注册结果6、 读入QQ号和密码: 读取所输入的QQ号和密码,并将数据送7。7、 检验输入资料: 检验输入的QQ号和密码,初步检查输入是否有误

13、,它是一个事务处理中心,有误则转6再次读入,检查无误则将数据送8。8、 准备服务器数据: 准备需发送到服务器的数据QQ号和密码,将准备好的数据送9。9、 准备网络数据包: 将数据准备/加密成网络传输数据包。10、 网络数据发送: 将数据包经网络发送到服务器程序, 它是程序与网络的接口。11、 读入并确定(聊天/提醒/查询好友/删除好友/删除组/更新组/添加组): 它是一个事务处理中心,若是聊天则转入12,提醒则转入14,查询好友转入16,删除好友转入18,删除组转入20,更新组转入22,添加组转入24。12、 接受/发送聊天信息: 读取网络送来的或所输入的聊天信息,并将数据送13。13、 显示

14、聊天信息: 在聊天窗口中显示聊天内容。14、 读取提醒用户的相关信息: 读取某上线用户的QQ号和昵称,并将数据送1515、 显示提醒: 显示信息提醒用户某好友上线16、 读入查询好友的相关信息:读取所输入的查询好友的相关信息,并将数据送17。17、 准备服务器数据:准备需要发送到服务器的数据查询好友的相关信息,将准备好的数据送9。18、 读入删除好友的QQ号:读取所输入的删除好友的QQ号,并将数据送19。19、 准备服务器数据:准备需要发送到服务器的数据删除好友的QQ号,将准备好的数据送9。20、 读入要删除组的名称:读取所输入的要删除组的名称,并将数据送21。21、 准备服务器数据:准备需要

15、发送到服务器的数据要删除组的名称,将准备好的数据送9。22、 读入要更新组的名称及重命名的名称:读取所选定组的名称和所输入的重命名的名称,并将数据送23。23、 准备服务器数据:准备需要发送到服务器的数据组的新旧名称,将准备好的数据送9。24、 读入要添加的组的名称:读取所输入的添加组的名称,并将数据送25。25、 准备服务器数据:准备需要发送到服务器的数据要添加组的名称,将准备好的数据送9。26、 网络数据接受:接受由服务器程序经网络传送到客户机的数据包, 它是程序与网络的接口。27、 解开/判断:解开26 所接受的数据包,并判断数据是登录数据/在线好友数据/好友列表数据/添加好友数据/查询

16、好友数据/删除好友数据/删除组数据/更新组数据/添加组数据,它是一事务处理中心,分别将数据送到28。28、 登录成功?由返回的数据判断登录是否成功,它是一事务处理中心,若登录成功则转到29、30、31、33,不成功则转到1。29、 准备服务器数据:准备需要发送到服务器的数据获取用户好友列表,将准备好的数据送9。30、 准备服务器数据:准备需要发送到服务器的数据获取在线好友列表,将准备好的数据送9。31、 读取好友列表:从本地相应文件中读取好友列表并判断每一好友的状态。32、 在用户在线面板显示好友:根据各好友状态在该用户在线面板上显示好友列表。33、 发送提醒:发送信息提醒在线好友该用户上线。

17、34、 读取好友列表:读取服务器发送过来的好友列表信息,并将数据送35。35、 保存好友列表:将服务器发送过来的好友列表保存至本地相应文件。36、 读取在线好友列表:读取服务器发送过来的在线好友列表信息,并将数据送37。37、 保存好友列表:将服务器发送过来的在线好友列表保存至本地相应文件。38、 读取查询好友结果:读取服务器发送过来的查询结果。并将数据送39。39、 显示查询好友结果:在相应的窗体中显示查询结果,转到40。40、 读取选定的好友信息:读取用户选定的要添加的好友QQ号和呢称,并将数据送41。41、 准备服务器数据:准备需要发送到服务器的数据要添加的好友QQ号和呢称,将准备好的数

18、据送9。42、 读取添加好友结果:读取服务器发送过来的添加好友结果,并将数据送43。43、 显示添加好友结果:弹出对话框显示添加好友结果。44、 读取删除好友结果:读取服务器发送过来的删除好友结果,并将数据送45。45、 显示删除好友结果:弹出对话框显示删除好友结果。46、 读取删除组结果:读取服务器发送过来的删除组结果,并将数据送45。47、 显示删除组结果:弹出对话框显示删除组结果。48、 读取更新组结果:读取服务器发送过来的更新组结果,并将数据送45。49、 显示更新组结果:显示更新组后的结果。50、 读取添加组结果:读取服务器发送过来的添加组结果,并将数据送45。51、 显示添加组结果

19、:弹出对话框显示添加组结果。3.2.2 功能模块仿QQ聊天软件系统主要分为两个功能模块:服务器端和客户端。1、 服务器端。服务器端的作用是从数据库中获取用户信息并向客户端服务,管理员可以开启关闭服务器,并对服务器进行配置。服务器端连接数据库生成用户好友列表服务器配置信息接受与发送在线好友记录操作登录验证开启服务暂停服务关闭服务查询好友删除好友添加好友数据处理添加分组更新分组删除分组图3-2 服务器模块图服务器开启服务后,随时侦听指定端口是否有客户端发送过来的信息,根据相应的信息与数据库交互进行数据的处理。2、 客户端。用户安装客户端软件后,可以通过登录界面登录系统,新用户可以注册后登录,登录后

20、与在线好友进行实时聊天,查询、添加、删除好友,更新、删除、添加组。客户端服务登 录注 册聊天退 出删除好友添加分组更新分组删除分组功能选择添加好友查询好友图3-3 客户端模块图3.3 详细设计1、 开启服务程序代码:StartServer;启动条件:点击开启服务按钮;功能:开启服务。准备输入服务器ip地址验证数据合法性开启服务数据合法图3-4 开启服务关键代码:public bool StartServer()tryqTcpListener = new TcpListener(qSerIpendPoint);qTcpListener.Start();qSerTh = new Thread(ne

21、w ThreadStart(QQServerIng);ServerRun = true;qSerTh.Start();return (true);catch return (false);2、 暂停服务程序代码:StopServer;启动条件:点击停止服务按钮;功能:暂停服务。准备暂停服务点击停止服务按钮图3-4 暂停服务关键代码:public bool StopServer()tryServerRun = false;qTcpListener.Stop();qSerTh.Abort();return (true);catchreturn (false);3、 服务器配置程序代码:qSaveC

22、onfigServer;启动条件:点击服务器配置按钮;功能:配置服务器。准备输入服务器信息验证数据合法性保存数据合法图3-5配置服务器关键代码:public class qSaveConfigServerpublic static bool SaveConfigServer(string ipadd, string port)tryStringBuilder str = new StringBuilder();string ConfigFileUrl = config/ipConfig.dat;str.Append(?xmlversion=1.0encoding=”UTF-8”?”);str.

23、Append( + ipadd + );str.Append( + port + );str.Append();StreamWriter save = new StreamWriter(ConfigFileUrl);save.Write(str.ToString();save.Close();return (true);catchreturn (false);public static bool SaveConfigDate(string ip, string database, string uid, string pwd)tryStringBuilder str = new StringB

24、uilder();string FileUrl = config/dataConfig.dat;str.Append(?xmlversion=1.0encoding=”UTF-8”?”);str.Append( + ip + );str.Append( + database + );str.Append( + uid + );str.Append( + pwd + );str.Append();StreamWriter save = new StreamWriter(FileUrl);save.Write(str.ToString();save.Close();return (true);ca

25、tchreturn (false); 4、 登录程序代码:Login;启动条件:点击登录按钮;功能:登录。准备输入QQ号和密码验证数据合法性发送登录信息之服务器数据合法进入用户界面加载好友列表图3-6 登录关键代码:客户端: public static bool QLogin(string uid, string pwd)string SerInfFile = SerInfSerInf.dat;stringStrIp=getSerInf.ReadXmlNode(SerInfFile,/root/server/ip);stringStrPort=getSerInf.ReadXmlNode(Ser

26、InfFile,”/root/server/port”);int port = int.Parse(StrPort);TcpClient tcpclnt = new TcpClient();tcpclnt.Connect(StrIp, port);Stream stm = tcpclnt.GetStream();UTF8Encoding sendmsg = new UTF8Encoding();byte arrysendmsg = sendmsg.GetBytes(1; + uid + ; + pwd);stm.Write(arrysendmsg, 0, arrysendmsg.Length)

27、;byte judge = new byte1;stm.Read(judge, 0, 1);string req = System.Text.Encoding.UTF8.GetString(judge);stm.Close();tcpclnt.Close();if (req.Trim() = 1)return (true);elsereturn (false);服务器:public static bool qUserLogin(string uid, string pwd)if (uid = -1 | pwd = -1)return (false);elsestring sql = strin

28、g.Format(select * from UserInf where cQQNum=0 and vcQuserPwd=1, uid, pwd);SqlConnection Conn = SqlConnectionTest.GetConnection();if (Conn != null)Conn.Open();SqlCommand Com = new SqlCommand(sql, Conn);SqlDataReader dr;dr = Com.ExecuteReader();if (dr.Read()Com.Dispose();Conn.Close();return (true);els

29、eCom.Dispose();Conn.Close();return (false);elsereturn (false);5、 聊天程序代码:MessageSend;启动条件:双击好友;功能:聊天。准备输入聊天信息发送信息图3-7 聊天关键代码:private void MessageSend() try string TOIpNumber = ; CheckOutNum NAN = new CheckOutNum(ToWho); this.ToIpName = NAN.QQname; this.MSG = msg; TOIpNumber = NAN.QQnumber; XmlDataDoc

30、ument Xml = new XmlDataDocument(); Xml.Load(online.dat); XmlNode root = Xml.SelectSingleNode(root); for (int i = 0; i root.ChildNodes.Count; i+) if (root.ChildNodesi.ChildNodes0.InnerText.Trim() = TOIpNumber.Trim() this.IpEndPoint = root.ChildNodesi.ChildNodes1.InnerText.Trim(); break; CheckOutIpPoi

31、nt IEP = new CheckOutIpPoint(IpEndPoint); TcpClient Send = new TcpClient(); Send.Connect(IEP.IpAdd, IEP.Port); Stream stm = Send.GetStream(); UTF8Encoding asen = new UTF8Encoding(); byte ba = asen.GetBytes(2; + ShareDate.ThisUser.Trim() + ; + MSG);/参数格式为(标识;原用户消息内容) stm.Write(ba, 0, ba.Length); Send

32、.Close(); result = true; catch result = false; 6、 查询好友程序代码:Queryfriend;启动条件:点击查询好友按钮;功能:查询好友准备输入要查的好友信息发送信息至服务器显示查询结果图3-9 查询好友关键代码:客户端:/ / 向服务器发送请求!查询好友/ / 用户号码/ 呢称/ 添加结果public string Qureyfriend(string UserNumber, string UserName)string SerInfFile = SerInfSerInf.dat;string StrIp = getSerInf.ReadXml

33、Node(SerInfFile, /root/server/ip);string StrPort = getSerInf.ReadXmlNode(SerInfFile, /root/server/port);int port = int.Parse(StrPort);TcpClient tcpclnt = new TcpClient();tcpclnt.Connect(StrIp, port);Stream stm = tcpclnt.GetStream();UTF8Encoding sendmsg = new UTF8Encoding();byte arrysendmsg = sendmsg

34、.GetBytes(3; + UserNumber + ; + UserName);stm.Write(arrysendmsg, 0, arrysendmsg.Length);byte judge = new byte1;stm.Read(judge, 0, 1);string req = System.Text.Encoding.UTF8.GetString(judge);stm.Close();tcpclnt.Close();switch (req)case -1:return (sorry!要查询的好友不存在!);case 00:return (恭喜!查找好友成功!请刷新);defaul

35、t:return (未知错误!);服务器:/ / 通过用户名查询用户/ / 需要查询的用户名/ public static DataSet SelectUserByName(string Name)DataSet ds = new DataSet();SqlConnection Con = SqlConnectionTest.GetConnection();Con.Open();SqlDataAdapter da = new SqlDataAdapter(SelectUserByName, Con);da.SelectCommand.CommandType = CommandType.Stor

36、edProcedure;SqlParameter UserName =da.SelectCommand.Parameters.Add(UserName, SqlDbType.Char, 10);UserName.Direction = ParameterDirection.Input;UserName.Value = Name;da.Fill(ds);da.Dispose();Con.Close();return (ds);/ / 通过用户号码查询用户/ / 需要查询的用户号码/ public static DataSet SelectUserByNum(string Num)DataSet

37、ds = new DataSet();SqlConnection Con = SqlConnectionTest.GetConnection();Con.Open();SqlDataAdapter da = new SqlDataAdapter(SelectUserByNum, Con);da.SelectCommand.CommandType = CommandType.StoredProcedure;SqlParameter UserNum = da.SelectCommand.Parameters.Add(UserNum, SqlDbType.Char, 8);UserNum.Direc

38、tion = ParameterDirection.Input;UserNum.Value = Num;da.Fill(ds);da.Dispose();Con.Close();return (ds);/ / 生成查询好友结果xml文件/ / 需要生成列表的用户名/ 返回生成的文件路径,-1意味着生成文件失败public string QureyFriendXml(string Owner, string qureyNum, string qureyName)trystring XmlUrl = temp+Owner.Trim() + qurey.xml;if (!File.Exists(Xm

39、lUrl)File.Create(XmlUrl).Close();StringBuilder add = new StringBuilder();StreamWriter str = new StreamWriter(XmlUrl);add.Append();add.Append();str.Write(add.ToString();str.Close();XmlDataDocument XmlData = new XmlDataDocument();XmlData.Load(XmlUrl);XmlNode root = XmlData.SelectSingleNode(root);if (q

40、ureyNum = & qureyName = )qureydata = opDate.GetAllUser();elseif (qureyNum = )qureydata = opDate.SelectUserByName(qureyName);elsequreydata = opDate.SelectUserByNum(qureyNum);for (int i = 0; i qureydata.Tables0.Rows.Count; i+) XmlElement qurey = XmlData.CreateElement(qurey);XmlElement QQnumber = XmlDa

41、ta.CreateElement(QQnumber);XmlElement QQname = XmlData.CreateElement(QQname);QQnumber.InnerText=qureydata.Tables0.RowsicQQNum.ToString().Trim();QQname.InnerText=qureydata.Tables0.RowsicUserName.ToString().Trim();qurey.AppendChild(QQnumber);qurey.AppendChild(QQname);root.AppendChild(qurey);XmlData.Save(XmlUrl); return

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号