1、 毕 业 设 计(论 文)基 于 TCP 协 议 的 数 据 网 络 通 信 设 计系 别: 信息技术系 专业名称: 通信技术 学生姓名: 李芳 学 号: 2009513230 指导教师: 周燕 完成日期 2012 年 4 月 西安科技大学高新学院毕业论文(设计)21基于 TCP 协议的简单即时通信软件的设计与实现摘 要即时通信(Instant Message),由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过 SOCKET 套接字接口实现的。当前的主流 UNIX 系统和微软的
2、 WINDOWS 系统都在内核提供了对 SOCKET 字接口的支持。使用这个统一的接口,可以编写一个可移植的 TCP/IP 通信程序。使信息能够在 INTERNET 上可靠的传输。本文设计并实现了基于局域网内的简单即时通信系统,系统采用 C/S 模式,底层通信通过 SOCKET 套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用 P2P 方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用 XML 序列化的消息进行通信。关键词:即时通信;文件传输;套接字;TCP 协议西安科技大学高
3、新学院毕业论文(设计)22The Design and Implementation of Simple Instant Message Software Based on TCP ProtocolAbstractInstant messages have several advantages such as real-time, cross-platform, cheap and efficient. To design a Multi-user IM (instant message) architecture is very important in both theory and re
4、alism. Instant message based on TCP/IP protocol that is realized by socket interface. Almost all UNIX operation systems and Microsofts windows operation systems provide support of socket in the kernel. Using the uniform interface, we can develop a portable program of TCP/IP, which help us transfer i
5、nformation in Internet safely and credibly.The system uses the client/server(C/S) mode. The server takes the responsibility of the login message of client, the saving of friend message and Message heartbeat. The transmission of the basic messages of the customer end will be designed on P2P architect
6、ure. This thesis explains how the client and server communicate via serializing XML message.Key words: Instant Message; File Transfer; Socket; TCP protocol基于 TCP 协议的简单即时通信软件的设计与实现.doc西安科技大学高新学院毕业论文(设计)23目 录1 引言 11.1 课题背景 12 相关技术介绍 22.1 .NET 开发平台及 C.NET 开发语言 .22.2 TCP 协议 .32.2.1 TCP/IP 网络协议 .32.2.2 T
7、CP传输控制协议 32.3 套接字 42.4 流 42.4.1 流的基本概念 42.4.2 .NET 中的流 .42.5 同步、异步、阻塞和非阻塞 52.6 C/S 模型 .52.7 即时通信协议 63 系统总体设计 73.1 需求分析 73.2 系统基本架构 73.3 功能模块设计 73.4 逻辑图 93.5 数据库设计 103.5.1 实体关系图 103.5.2 详细列表 104 系统实现 114.1 使用 XML 定义的即时通信协议 114.1.1 信息结构 MESSAGE.CS对每种可能的情况必须规定具体的动作。有许多的 IM 系统,如 AOL IM、Yahoo IM 和 MSN IM
8、,它们使用了不同的技术,而且它们互不兼容。为了创建即时通信的统一标准,人们经过了多次尝试:IETF 的对话初始协议(SIP)和 即时通信对话初始协议和表示扩展协议(SIMPLE) 、应用交换协议(APEX) 、显示和即时通信协议(PRIM)及基于 XML 且开放的可扩展通信和表示协议(XMPP)协议(常称为 Jabber 协议) 。人们多次努力,试图统一各大主要 IM 供应商的标准(AOL、Yahoo 及 Microsoft) ,但无一成功,且每一种 IM 仍然继续使用自己所拥有的协议。 本系统目的在于实现一个简单的即时通信过程,没有必要采用通用的比较复杂的即时通信协议,因此使用了简单定义的
9、XML 标记定义来规范即时通信的各种网络信息,在网络中传输序列化的 XML 语言。3 系统总体设计3.1 需求分析软件针对局域网内部用户,实现用户间的即时通信。需要分别实现服务器端和西安科技大学高新学院毕业论文(设计)第 6 页 客户端的软件设计。服务器端负责监听用户连接请求,负责连接数据库存储用户信息,负责发送给用户好友信息,负责发送心跳报文检查用户在线状态并即时让用户更新好友在新信息。客户端发起主动连接,向服务器请求登录或者注册。客户端可以修改昵称,可以加已知用户为好友(类似于 MSN 的好友添加功能) 。客户端之间可以发起 P2P 模式的聊天,可以传送文件。3.2 系统基本架构基于 C/
10、S 架构的即时通信软件便于对用户信息进行统一管理和保存,面向特定的用户,对信息的安全控制能力很强。为了减轻服务器负担,客户端之间的信息传递是采用 P2P 模式的,服务器只负责用户的注册,登录和用户在线状态的检验。基本结构如图:C L I E N TC L I E N T注 册和登录信息S E R V E R返 回 信息注 册和登录信息返 回信息聊天 信息 , 文件传 输图 1 系统基本架构3.3 功能模块设计CLIENT:1. 注册:(1)可以完成客户端注册,客户端可以通过填写信息进行注册,信息被发送到服务器端。2. 登录:(1)客户可以输入账号和密码进行登录,客户端会发送登录信息等待服务器响
11、应,登录成功后会发出登录成功信息并刷新好友列表。3. 修改:(1)密码修改:应该有密码修改功能(2)信息修改:可以更改一些注册信息4. 通信:西安科技大学高新学院毕业论文(设计)第 7 页 (1)即时聊天模块:客户端与客户端之间建立线程进行即时聊天,也包含有简单的对称加解密算法功能。(2)好友列表:可以对好友列表进行添加删除等动作5. 文件传输:(1)文件传输:文件传输功能SERVER:1. 注册回应:对客户端传送的注册信息进行判断。(1)HASH 加密:对用户的账号和密码信息进行 HASH 加密(2)重复用户检查:将加密后信息与已存在账号进行比较,检查是否账号已存在,如果存在就返回错误信息(
12、3)注册成功:将可成功注册的用户账号和密码写入数据库内,并向客户端返回成功信息2. 修改回应:(1)对密码和信息修改请求进行判断,执行和返回修改成功信息3. 登录回应:(1)对登录的账号和密码进行加密检查后发回正确或错误情况,并记录上线信息(2)好友列表发送:给成功登录的账号发送好友列表及好友上线信息(3)上线信息发送:给成功登录的账号的好友发送在线信息(包括 IP,端口等等信息)4. 在线情况:(1)对登录,在线,离线的用户情况进行统计,记录和通知(2)心跳测试:每隔一段时间发送报文测试用户是否因意外原因离线(3)情况记录:将用户登录时间,IP,下线时间等信息记录入数据库西安科技大学高新学院
13、毕业论文(设计)第 8 页 3.4 逻辑图注 册登 录注册 回应在线 情况C L I E N T S E R V E R用户信息管理密码 修改信息 修改取得 好友列 表修改 回应H A S H加 密注册 成功登录 回应好友 列表发 送上线 信息发 送注 册 信息 检 查注册 失败YN心 跳测 试N离 线文件 传输消息 加密消息 解密即时 聊天在线 情况记 录Y图 2 逻辑图3.5 数据库设计3.5.1 实体关系图服务器是作为记录和读取数据库信息的载体,与客户端关系并不复杂,这里需西安科技大学高新学院毕业论文(设计)第 9 页 要重点考虑客户端之间的关系。用户与用户之间的关系是较为特殊的递归关系
14、,即描述发生在两个相同实体上的关系。E-R 图如下:聊天文件传输nn用户ID好友ID状态IP客户端账号昵称EmailID密码好友分组状态客户端账号昵称EmailID密码好友分组IP图 3 E-R 图3.5.2 详细列表数据库包含两个表,分别为记录用户信息的 TCP_Userinfo 和记录用户好友信息的 TCP_Friendinfo。详细设计见下面两表:表 1 用户信息表 TCP_UserInfoTCP_Userinfo列(属性)名 类型 主键 宽度 是否允许为空 备注UserID numeric Y 9 NOT NULL 自增长UserAccount nchar N 20 NOT NULL
15、用户帐号UserNickname nchar N 20 NOT NULL 用户昵称,可重复UserEmail nchar N 20 NOT NULL 用户 EMAILJoinDate nchar N 35 NOT NULL 注册日期LastLogin nchar Y 20 NOT NULL 最后登录 IPUserIP nchar Y 20 NOT NULL 用户 IPUserFav varchar N 100 NOT NULL 用户好友分组,有默认值UserQuestion nchar Y 20 NOT NULL 密码问题UserAnswer nchar Y 20 NOT NULL 密码答案U
16、serPassword nchar N 20 NOT NULL 用户密码UserOnline int N 4 NOT NULL 在线状态,1 在,0 不在表 2 用户好友表 TCP_FriendInfoTCP_Userinfo列(属性)名 类型 主键 宽度 是否允许为空 备注InfoID numeric Y 9 NOT NULL 自增长UserID nchar N 20 NOT NULL 用户 IDFriendID nchar N 20 NOT NULL 用户好友 IDFriendGroup nchar N 20 NOT NULL 用户好友分组西安科技大学高新学院毕业论文(设计)第 10 页
17、4 系统实现4.1 使用 XML 定义的即时通信协议4.1.1 信息结构 MESSAGE.CS/新建一个用于监听的线程th.Start();/打开新线程不仅仅是服务器,基于 P2P 模式聊天的客户端也必须支持多线程运行,实现代码与之类似,在客户端设计说明中将不再叙述。4.3.3 计时器计时器用于实现心跳报文的功能,服务器在启动以后就开始计时,每隔一定时间就向所有连入的客户端发送信息,核心代码如下:/用计时器检查客户端是否掉线System.Timers.Timer aTimer = new System.Timers.Timer();aTimer.Elapsed += new ElapsedEv
18、entHandler(CheckStatus);/ 设置引发时间的时间间隔 此处设置为5秒(毫秒)aTimer.Interval = 5000;aTimer.Enabled = true; CheckStatus 就是用于向客户端发送检查信息的方法,它会向遍历连入的客户端(alSock),然后依次向客户端发送信息,如果发现客户端没有响应,就会如果发现对方无回应,则关闭相应的 SOCKET,并更新数据库的用户在线状态,同时向该用户的所有好友发送用户已下线的通知。西安科技大学高新学院毕业论文(设计)第 12 页 4.4 客户端图 5 注册界面图 6 登录、聊天、文件传输界面4.4.1 同步套接字客
19、户端客户端发起同步套接字连接,并传送登录或者注册信息,由于两者方式类似,这里仅列出用户登录的代码:#region 发送服务器登录信息,并接收服务器反馈信息public void Client()建立 SOCKET 发送信息:tryIPEndPoint ServerIPEP = new IPEndPoint(IPAddress.Parse(“222.18.170.16“),8888);好友详细信息列表聊天信息西安科技大学高新学院毕业论文(设计)第 13 页 c = new Socket(ServerIPEP.AddressFamily,SocketType.Stream,ProtocolType
20、.Tcp);c.Connect(EndPoint)ServerIPEP);s = new MemoryStream();_translator.Serialize(s,_message);byte d=new bytes.Length;s.Seek(0, SeekOrigin.Begin);s.Read(d, 0, d.Length);int i = c.Send(d, 0, d.Length, SocketFlags.None);catch(Exception ex)MessageBox.Show(ex.Message);以下代码读取了服务器返回给客户端的信息(注册和登录的成功与失败) ,如
21、果返回了登录成功的信息,还会读取服务器给出的 FriendStruct 结构以得到用户的好友信息:#region 接收反馈信息byte data = new byte2048;while(true)int rect = c.Receive(data);byte chat = new byterect;Buffer.BlockCopy(data,0,chat,0,rect);UMessage bumessage = (UMessage)_translator.Deserialize(new MemoryStream(chat);string fg;string _fg=bumessage.Fg;
22、if(bumessage.Info=3)else if(bumessage.Info=11)fg=_fg.Split(,);int xxx=bumessage.Fn;ff=bumessage.Fri;for(int i=0;ixxx;i+)string ems=new string5;ems0=ffi.account;ems1=ffi.nickname;ems2=fgint.Parse(ffi.fg);ems3=ffi.IP;ems4=ffi.status;ListViewItem item = new ListViewItem(ems);西安科技大学高新学院毕业论文(设计)第 14 页 th
23、is.listView1.Items.Add(item);CSERVER 是一个用于开启监听 P2P 信息的方法,客户端在登录成功以后就会立刻开启监听器,才能够实现与其它客户端的聊天:th = new Thread(new ThreadStart(CServer);/新建一个用于监听其它客户端信息的线程th.Start();/打开新线程MessageBox.Show(bumessage.Accounts+“登录成功!“);this.Button1.Enabled=false;this.Button3.Enabled=false;else if (bumessage.Info=2)Message
24、Box.Show(“服务器未知错误“);elseMessageBox.Show(bumessage.Info.ToString();#endregion#endregion图 7 登录成功后的客户端界面客户端之间的聊天同样使用了序列化的 XML 文档,用户在登录成功后就会启动一个新的监听器去监听其它客户端传入的聊天信息并且进行判断再将其它用户的聊天信息显示在界面上。这里也不再阐述代码。西安科技大学高新学院毕业论文(设计)第 15 页 4.4.2 采用异步套接字的文件传输文件传输是通过一个类库实现的。由于文件传输的代码实现复杂,通过类库可以大量的简化代码,使主程序简洁易懂。类库 Infinity
25、.Networking 包括了ClientBase.cs,ClientInfo.cs,Delegates.cs,INPClient.cs,INPServer.cs,ClientBase.cs 定义了基础的文件发送函数,INPClient.cs 则仅包含初始化文件发送的函数;ServerBase.cs 和 INPServer.cs 则是反之亦然。结 论即时通信是是网络发展的必然趋势,它的技术仍然在不断的改进和蓬勃发展中。本次设计虽然实现了简单的即时通信功能,但是从很多方面来说都是不完善的:实现了字符聊天却没有实现多媒体即时通信;实现了同步套接字聊天和异步套接字传送文件却没有实现更科学的异步套接字
26、聊天和同步套接字传送文件。在本次设计中,我深刻体会到 SOCKET 编程的基础性,多样化。由于与网络紧密联系,SOCKET 编程的也可能出现各种未知的问题,需要我们更深入地了解网络协议和架构,才可能做出通用性高,稳定性高的即时通信程序。西安科技大学高新学院毕业论文(设计)第 16 页 参考文献1 Tobin. Titus, Fabio Claudio Ferracchiati. C#线程参考手册M.王敏译.北京:清华大学出版社,2003。2 黄承安,谢东文,许聪. C#网络应用案例导航M.北京:中国铁道出版社,2003。3 Andrew Krowczyk, vinod Kumar. .NET
27、网络高级编程M.北京:清华大学出版社,2003。4 周存杰. Visual C# .NET 网络核心编程M.北京:清华大学出版社,2002。5 方睿,吴四九,刁仁宏. 网络数据库原理及应用M.四川:四川大学出版社,2005。6 李文志 ,申剑 ,卢方国,柳正青,王宏,陈建伟. 在.NET 框架下开发一个即时通信系统J.现代计算机.2004(2):68-72。7 王跃 . INTERNET 上大规模用户即时通信方法研究 D.北京:北京工业大学硕士论文,2004。西安科技大学高新学院毕业论文(设计)第 17 页 致 谢本文是在周老师的热情关心和指导下完成的,她渊博的知识和严谨的治学作风使我受益匪浅,对顺利完成本课题起到了极大的作用。在此向他表示我最衷心的感谢!在论文完成过程中,本人还得到了其他老师和同学的热心帮助,本人向他们表示深深的谢意!最后向在百忙之中评审本文的各位专家、老师表示衷心的感谢!