基于TCP协议的简单即时通信软件的设计与实现(含源文件)_第1页
基于TCP协议的简单即时通信软件的设计与实现(含源文件)_第2页
基于TCP协议的简单即时通信软件的设计与实现(含源文件)_第3页
基于TCP协议的简单即时通信软件的设计与实现(含源文件)_第4页
基于TCP协议的简单即时通信软件的设计与实现(含源文件)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 1 页 共 20 页 基于基于 TCP 协议的网络通信系统的设计与实现协议的网络通信系统的设计与实现 摘摘 要要 网络通信 由于其具有实时性 跨平台性 成本低 效率高等优点而受 到广泛的使用 设计并实现一个能够处理多用户进行实时 安全的即时通信系 统具有较强的现实意义 即时通信的底层通信是通过 SOCKET 套接字接口实现 的 当前的主流 UNIX 系统和微软的 WINDOWS 系统都在内核提供了对 SOCKET 字接口的支持 使用这个统一的接口 可以编写一个可移植的 TCP IP 通信程序 使信息能够在 INTERNET 上可靠的传输 本文设计并实现了基于局域网内的简单即时通信系统 系统采用 C S 模式 底层通信通过 SOCKET 套接字接口实现 服务器负责客户端的登录验证 好友 信息的保存和心跳报文的发送 客户端采用 P2P 方式实现消息传递 并能实现 文件的传输 本文首先讨论了同步套接字 异步套接字 多线程并发执行任务 等 然后阐述了客户端 服务器如何使用 XML 序列化的消息进行通信 关键词 即时通信 文件传输 套接字 TCP 协议 Abstract Instant 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 realism In stant message based on TCP IP protocol that is realized by socket interface Almost al l UNIX operation systems and Microsoft s windows operation systems provide suppor t of socket in the kernel Using the uniform interface we can develop a portable progr am of TCP IP which help us transfer information in Internet safely and credibly The system uses the client server C S mode The server takes the responsibility of th e login message of client the saving of friend message and Message heartbeat The tra nsmission of the basic messages of the customer end will be designed on P2P architec ture This thesis explains how the client and server communicate via serializing XML message Key words Instant Message File Transfer Socket TCP protocol 第 2 页 共 20 页 引言引言 1 1 课题背景 即时通信是一个终端连往一个即时通信网路的服务 即时通信不同于 e mail 在于它的交谈是实时的 大部分的即时通信服务提供了 presence awareness 的特性 显示联络人名单 联络人是否在在线与能否与联络人交谈 最早的即时通信软件是 ICQ ICQ 是英文中 I seek you 的谐音 意思是我找 你 四名以色列青年于 1996 年 7 月成立 Mirabilis 公司 并在 11 月份发布了最 初的 ICQ 版本 在六个月内有 85 万用户注册使用 在因特网上受欢迎的即时通信服务包含了 MSN Messenger AOL Instant Messenger Yahoo Messenger NET Messenger S ervice Jabber ICQ 与 QQ 这些服务有赖于许多想法更久的 与普遍 的在线 聊天媒介 如 Internet Relay Chat 一样知名 1970 年代早期 一种更早的即时通信形式是柏拉图系统 PLATO system 之后在 1980 年代 UNIX Linux 的交谈实时信息被广泛的使用于工程师与学术 界 1990 年代即时通信更跨越了因特网交流 1996 年 11 月 ICQ 是首个广泛 被非 UNIX Linux 使用者用于因特网的即时通信软件 在 ICQ 的介绍之后 同 时在许多地方有一定数量的即时通信方式发展 且各式的即时通信程序有独立 的协议 无法彼此互通 这引导使用者同时执行两个以上的即时通信软件 或 者他们可以使用支持多协议的终端软件 如 Gaim Trillian 或 Jabber 1 2 国内外研究现状 1 2 1 国外研究现状 当今 国际上对网络通信系统研究的较好的公司有 思科 Sun Ms 等公 司 思科主要研究的是底层的传输 MS Sun 公司研究的是应用层 其中 ms 公司凭借其在操作系统的垄断地位 为了在网络的发展中取得先机 采用了各 种各样的手段 但是 其捆绑的 msn 无论从功能上 还是技术上来说 都不 算是非常先进的 当然 ie 同样也不是很受人青睐 这让人想起了 当年的 网景公司 网景只是生不逢时 MS 不择手段的想打跨网景 可见其对网络的 重视 如今 Sun 公司在网络应用上捷足先登 凭借着 Java Sun 在网络的应 用上领先于 MS 微软 想用同样的办法搞跨对手 因此它拿出了 Visual c 来对抗 Java 这些都是在应用层面的开发工具 应用层上的产品就更显种类繁 多 ICQ 几乎是国际上通用的即时通信工具 由于在我国它的应用不是很广 所以 其原理也很少被介绍 msn 是 MS 的产品 同样在国内没什么市场 所以 对其原理 也很少被讨论过 至于 ie 是在 Visual c 下开发的产品 虽然有严重的安全隐患 不过 至少能在某种程度上代表当今国际研究的水平 此外 国际上最近出先了新的浏览器 Firefox 其性能据说是远高于 ie 也许在 网络的天下 Ms 又有了更强劲的对手 1 2 2 国内研究现状 国内在应用层上的网络应用软件目前发展异常的火爆 因为我国有着网络 应用的最大的市场 现在国内网络的基础性建设发展迅速 应用软件也层出不 穷 其中 在游戏的领域中 网络通信的工作做的不错 如联众游戏平台 还 有其他的一些平台 这些平台基本上都是基于 VC 的 用的都是 Socket 通信 但是为了效率 这些平台没有用 MFC 提供的 CSocket 类 而是直接用 Socket 进行通信 所以效率上不错 此外 tencent 的即时通信 也是做的很好的 从 某中程度上来说 代表了国内最高的水平 第 3 页 共 20 页 1 3 本课题的研究方法 本系统采用 C S Client Server 结构进行设计 使用 SQL Server 2000 构建数 据库 并在 NET 环境下使用 Visual C net 语言和 SOCKET 套接字开发一个基 于 TCP 协议的简单即时通信软件 实现简单的即时聊天 文件传输等功能 2 相关技术介绍 2 1 NET 开发平台及 C NET 开发语言 NET 框架是 Microsoft 公司推出的一种全新的开发平台 提供了统一的 面向 对象并且可以扩展的编程类库和完善的集成开发环境 大大简化了应用程序的开 发过程 并且具有良好的移植性和安全性 微软为了推行 NET 战略 特别为 NET 平台设计了一种语言 C C 是 由 C 和 C 派生而来的一种 简单 流行 面向对象 类型安全 的程序设计 语言 其综合了 Visual basic 的高效率和 C 的强大功能 然而更多的人感觉 C 更类似 JAVA 2 2 TCP 协议 2 2 1 TCP IP 网络协议 协议是对等的网络实体之间通信的规则 可以简单地理解为网络上各计算机 彼此交流的一种 语言 网络通信协议设计的基本原则是层次化 层和协议 的集合被称为网络体系结构 相邻层之间的接口定义了下层向上层提供的基本 操作和服务 下层向上层提供的服务分两种形式 面向连接的服务和无连接的 服务 计算机网络中已经形成的网络体系结构主要有两个 OSI 参考模型和 TCP IP 参考模型 TCP IP 参考模型是因特网 Internet 的基础 和 OSI 的 7 层协议相比 TCP IP 协议只有 4 个层次 通常说的 TCP IP 是一组协议的总称 TCP IP 实际上是一个协议族 包括 100 多个相互关联的协议 其中 IP Internet Protocol 网际协议 是网络层最主要的协议 TCP Transmission Control Protocol 传输控制协议 和 UDP User Datagram Protocol 用 户数据报协议是传输层中最主要的协议 一般认为 IP TCP UDP 是最根本的 三种协议 是其他协议的基础 2 2 2 TCP 传输控制协议 面向连接的通信可以使用可靠通信 在这时候 第四层协议发送数据接收方的确认 如果未收到数据或者数据被损坏 则请求 重新传输 TCP 协议就使用这种可靠通信 使用 TCP 协议的应用层协议包括 HTTP FTP SMTP 和 Telnet 等 现在可以发送和接收消息了 接收消息后 总是返回 ACK 消息 如果在收 到 ACK 之前发送方已经超时 则消息将被放到重发队列中以再次发送 由于它的握手机制 所以 TCP 协议比较复杂并且费时 但此协议在处理数 据时对数据包的传送有保障 从而使得在应用程序协议中不需要再包括该功能 2 3 套接字 套接字这个术语并没有定义某个协议 它具有两层含义 但两者都与一个协 议相关 第一个含义是套接字编程 API 它最初由伯克利大学为 BSD UNIX 而 创建 BSD 套接字在经过修改后被用作 Windows 环境的编程接口 并且被命名 为 WinSock WinSock API 被包装在 System Net sockets 命名空间的 NET 类中 Windows Sockets 是一个独立于协议的编程接口 用于编写网络应用程序 第 4 页 共 20 页 2 4 流 2 4 1 流的基本概念 流的概念已经存在很长时间了 流是一个用于传输数据的对象 数据的传 输有两个方向 1 如果数据从外部源传输到程序中 这就是读取流 2 如果数据从程序传输到外部源 这就是写入流 外部源常常是一个文件 但也不完全都是文件 它还可以是 1 网络 使用一定的网络协议与网络上其它计算机或终端交换数据 2 一个指定的管道 3 一块内存区域 2 5 同步 异步 阻塞和非阻塞 同步 synchronous 所谓同步方式 就是发送方发送数据包以后 不等接 受方响应 就接着发送下一个数据包 异步 asynchronous 异步方式就是当发送方发送一个数据包以后 一直 等到接受方响应后 才接着发送下一个数据包 阻塞 Block 指执行此套接字的网络调用时 直到调用成功才返回 否 则此套节字就一直阻塞在网络调用上 比如调用 StreamReader 类的 Readlin 方法读取网络缓冲区中的数据 如果调用的时候没有数据到达 那么此 Readlin 方法将一直挂在调用上 直到读到一些数据 此函数调用才返回 非阻塞 Unblock 指在执行此套接字的网络调用时 不管是否执行成功 都立即返回 同样调用 StreamReader 类的 Readlin 方法读取网络缓冲区中数 据 不管是否读到数据都立即返回 而不会一直挂在此函数调用上 在 Windows 网络通信软件开发中 最为常用的方法就是异步非阻塞套接字 平常所说的 C S 客户端 服务器 结构的软件采用的方式就是异步非阻塞模式 的 其实在用 C 进行网络编程中 我们并不需要了解什么同步 异步 阻塞和 非阻塞的原理和工作机制 因为在 Net FrameWrok SDK 中已经已经把这些机制 给封装好了 3 系统总体设计 3 1 需求分析 软件针对局域网内部用户 实现用户间的即时通信 需要分别实现服务器端 和客户端的软件设计 服务器端负责监听用户连接请求 负责连接数据库存储用户信息 负责发送 给用户好友信息 负责发送心跳报文检查用户在线状态并即时让用户更新好友 在新信息 客户端发起主动连接 向服务器请求登录或者注册 客户端可以修改昵称 可以加已知用户为好友 类似于 MSN 的好友添加功能 客户端之间可以发 起 P2P 模式的聊天 可以传送文件 3 2 系统基本架构 基于 C S 架构的即时通信软件便于对用户信息进行统一管理和保存 面向特 定的用户 对信息的安全控制能力很强 为了减轻服务器负担 客户端之间的 信息传递是采用 P2P 模式的 服务器只负责用户的注册 登录和用户在线状态 的检验 基本结构如图 第 5 页 共 20 页 3 3 功能模块设计 CLIENT 1 注册 1 可以完成客户端注册 客户端可以通过填写信息进行注册 信息被发送到 服务器端 2 登录 1 客户可以输入账号和密码进行登录 客户端会发送登录信息等待服务器响 应 登录成功后会发出登录成功信息并刷新好友列表 3 修改 1 密码修改 应该有密码修改功能 2 信息修改 可以更改一些注册信息 4 通信 1 即时聊天模块 客户端与客户端之间建立线程进行即时聊天 也包含有简 单的对称加解密算法功能 2 好友列表 可以对好友列表进行添加删除等动作 5 文件传输 1 文件传输 文件传输功能 SERVER 1 注册回应 对客户端传送的注册信息进行判断 1 HASH 加密 对用户的账号和密码信息进行 HASH 加密 2 重复用户检查 将加密后信息与已存在账号进行比较 检查是否账号已存 在 如果存在就返回错误信息 3 注册成功 将可成功注册的用户账号和密码写入数据库内 并向客户端返 回成功信息 2 修改回应 1 对密码和信息修改请求进行判断 执行和返回修改成功信息 3 登录回应 1 对登录的账号和密码进行加密检查后发回正确或错误情况 并记录上线信息 2 好友列表发送 给成功登录的账号发送好友列表及好友上线信息 3 上线信息发送 给成功登录的账号的好友发送在线信息 包括 IP 端口等等 信息 4 在线情况 1 对登录 在线 离线的用户情况进行统计 记录和通知 2 心跳测试 每隔一段时间发送报文测试用户是否因意外原因离线 3 情况记录 将用户登录时间 IP 下线时间等信息记录入数据库 3 4 逻辑图 3 5 数据库设计 第 6 页 共 20 页 3 5 1 实体关系图 服务器是作为记录和读取数据库信息的载体 与客户端关系并不复杂 这里需 要重点考虑客户端之间的关系 用户与用户之间的关系是较为特殊的递归关系 即描述发生在两个相同实体上的关系 4 系统实现 4 1 使用 XML 定义的即时通信协议 4 1 1 信息结构 MESSAGE CS private string password private string accounts private string email private int info 表示注册或者登录信息 客户端信息 0 为注册 1 为登录 服务器返回信息 0 为用户已存在 1 为注册成功 2 为服务器未知错误 3 为 CLIENT 在线检查 10 为登录失败 11 为登录成功 private Friend friend private int fn private string fg public string Nickname get return nickname set nickname value public string Password get return password set password value public string Accounts 第 7 页 共 20 页 get return accounts set accounts value public string Email get return email set email value public int Info get return info set info value public Friend Fri get return friend set friend value public int Fn get return fn set fn value public string Fg get return fg set fg value 由于 MESSAGE CS 与 UMESSAGE CS 类似 在此不再详述 服务器和客户端都可以通过相同的代码对 UMESSAGE 赋值 再通过 XmlSerializer 方法进行将 UMESSAGE 序列化为 XML 文档 最后将 XML 文档 转化为网络流进行传输 代码如下 region 将登录信息转为 UMessage private void Traslator message Accounts this TextBox1 Text message Nickname message Password this TextBox2 Text message Email message Info 1 message Fri null 第 8 页 共 20 页 endregion 4 1 2 数据结构 FriendStruct 服务器如果保存和传递用户的好友信息是难点之一 数据库的设计和信息 的传递辨别都是比较难实现的 在数据库方面 每个用户拥有各自的好友分组信息 UserFav 分组中间 使用 分隔 在 TCP FriendInfo 表中则分别保存了用户 ID 和好友 ID 使 用一个 INT 字段保存分组信息 数据库以用户 ID 为标准对好友 ID 和分组信息 进行内连接查询 就可以得到基本的好友信息了 代码如下 select from TCP UserInfo join TCP FriendInfo on TCP FriendInfo UserID uid and TCP UserInfo UserID TCP FriendInfo FriendID 在好友信息的传输方面 首先定义一个 FriendStruct 数据结构 当然也可以 用枚举完成 如下 using System using System Collections Generic using System Text namespace TCP public class FriendStruct public struct FileInfo public int filere 接收和拒绝信息 1 为接收 2 为拒绝 3 为取消 public string filename public long filelength public struct Friend public string account public string nickname public string IP public string status public string fg 好友分组 在 MESSAGE CS 或者 UMESSAGE CS 中 我们则定义了 FriendStruct 的数 组 在 C 中使用 DATAREADER 语句可以逐句读取数据库查询的结果 再依 次将结果赋值 FriendStruct 数组元素 就得到了便于发送和读取的存放好友信息 的数组 赋值代码如下 while getf Read getf 即是以上的数据库查询的 datareader 语句 ff i account getf UserAccount ToString ff i IP getf UserIP ToString ff i nickname getf UserNickname ToString ff i status getf UserOnline ToString 第 9 页 共 20 页 ff i fg getf FriendGroup ToString i getf Close 4 2 数据库连接类 实现一个快捷简单的数据库连接的相关代码是非常有必要的 实现的途径 也多种多样 鉴于安全性和复杂性的需求不同 实现方法有简有繁 本设计使 用了一个简单的类 UserData CS 实现了简单快捷的数据库连接和读取 主要 代码如下 public static SqlConnection connStr new SqlConnection Server D96B85DD938A465 uid sa pwd change database TC PDB public static SqlDataReader SqlReader string sql SqlConnection connstr SqlDataReader sqldr null SqlCommand cmd new SqlCommand sql connstr if cmd Connection State ToString Closed cmd Connection Open try sqldr cmd ExecuteReader catch Exception e catch Exception e if e null sqldr null return sqldr 数据库操作连接 public static string SqlCmd string sql SqlConnection connstr string errorstr null SqlCommand sqlcmd new SqlCommand sql connstr if sqlcmd Connection State ToString Open sqlcmd Connection Close sqlcmd Connection Open try sqlcmd ExecuteNonQuery catch Exception e 第 10 页 共 20 页 if e null errorstr e ToString sqlcmd Connection Close return errorstr 在 UserData CS 的基础上 主程序可以更方便地实现数据库连接操作 对 数据库进行读写和更新 在此不再详述 4 3 服务器端 服务器端的界面设计是基于便于测试的目的而实现的 如下图 4 3 1 同步套接字网络监听 基于同步套接字的网络监听器对服务器来说并不是最好的解决方案 但是仍然 可行并且实现简单 主要代码如下 开启监听端口 public void Serve int port 8888 ServerIPEP new IPEndPoint IPAddress Any port s new Socket ServerIPEP AddressFamily SocketType Stream ProtocolTyp e Tcp s Bind EndPoint ServerIPEP s Listen 10 alSock new ArrayList 以下代码读取连入的连接 依次将连接加入可变长数组 alsock 并且读取传入 的信息 进行反串行化 while true try uc s Accept 第 11 页 共 20 页 alSock Add uc this tb states AppendText System Convert ToString uc byte data new byte 2048 int rect uc Receive data byte chat new byte rect Buffer BlockCopy data 0 chat 0 rect UMessage umessage UMessage translator Deserialize new MemoryS tream chat int info umessage Info 对反串行化后的信息进行处理 通过 info 参数辨认客户端行为 注 册或者登录 对注册的信息进行数据库查询 注册信息可插入 则将用户信 息插入数据库 否则返回客户端 注册出错 的信息 region 处理用户注册信息 if info 0 分辨出用户发送的是注册信息 string Accounts umessage Accounts SqlDataReader usdr FPara SqlReader select from TCP UserInfo where UserAccount Accounts FPara connStr if usdr null if usdr Read region 此处写入返回注册失败的代码 Socket sc Socket alSock alSock IndexOf uc 0 sc Send chat endregion else region 此处写入插入数据库用户注册信息的代码 Stream ms new MemoryStream Socket sc Socket alSock alSock IndexOf uc 0 if FPara SqlCmd insert into TCP UserInfo UserAccount UserNickname UserEmai l JoinDate UserIP UserPassword values umessage Accounts umessage N ickname umessage Email System DateTime Now ToString IPEndPoint uc RemoteEndPoint Address ToString umessage Password FPara connStr null umessage Info 1 translator Serialize ms umessage byte d new byte ms Length ms Seek 0 SeekOrigin Begin 第 12 页 共 20 页 ms Read d 0 d Length sc Send d else umessage Info 2 translator Serialize ms umessage byte d new byte ms Length ms Seek 0 SeekOrigin Begin ms Read d 0 d Length sc Send d endregion usdr Close endregion 如果发现用户发送的是登录信息 就根据登录信息中的用户名和密码判断是否 存在用户 密码是否正确 成功后再查询出用户的好友信息并且赋值给 FriendStruct 再将信息返回给客户端 region 处理用户登录信息 else if info 1 分辨出用户发送的是登录信息 string Accounts umessage Accounts string Password umessage Password SqlDataReader usdr FPara SqlReader select from TCP UserInfo where UserAccount Accounts and UserPassword Passwor d FPara connStr if usdr null if usdr Read string uid usdr UserID ToString umessage Fg usdr UserFav ToString usdr Close SqlDataAdapter sdr new SqlDataAdapter select from TCP User Info join TCP FriendInfo on TCP FriendInfo UserID uid and TCP UserInf o UserID TCP FriendInfo FriendID FPara connStr DataSet ds new DataSet sdr Fill ds find int xxx ds Tables find Rows Count FPara SqlCmd update TCP UserInfo set UserIP IPEndPoint uc RemoteEndP 第 13 页 共 20 页 oint Address ToString UserOnline 1 where UserAccount Accounts FPara connStr ff new Friend xxx int i 0 SqlDataReader getf FPara SqlReader select from TCP UserInfo join TCP FriendInfo on TCP FriendInfo UserID uid and TCP UserInfo Us erID TCP FriendInfo FriendID FPara connStr while getf Read ff i account getf UserAccount ToString ff i IP getf UserIP ToString ff i nickname getf UserNickname ToString ff i status getf UserOnline ToString ff i fg getf FriendGroup ToString i getf Close region 此处写入登录成功代码 Stream ms new MemoryStream Socket sc Socket alSock alSock IndexOf uc 0 this lb users Items Add alSock IndexOf uc ToString umessage Info 11 umessage Fri ff umessage Fn xxx translator Serialize ms umessage byte d new byte ms Length ms Seek 0 SeekOrigin Begin ms Read d 0 d Length sc Send d 在 tb status 中写入服务器返回给客户端的代码便于测试观 察 this tb states AppendText System Text Encoding Default GetString d endregion else usdr Close region 此处写入登录失败代码 第 14 页 共 20 页 Stream ms new MemoryStream Socket sc Socket alSock alSock IndexOf uc 0 umessage Info 10 translator Serialize ms umessage byte d new byte ms Length ms Seek 0 SeekOrigin Begin ms Read d 0 d Length sc Send d endregion endregion Tb states 是个用于监视 SOCKET 传入信息的文本框 便于观察和测试相关信息 this tb states AppendText uc RemoteEndPoint ToString S ystem Text Encoding Default GetString chat catch Exception ex MessageBox Show ex Message 以上代码也包含了对客户端的请求信息的判断和对客户端返回信息的生成和传 输 4 3 2 多线程 对于服务器来说 多线程是必不可少的 否则它将无法处理不断请求的新连接 C 的 System Threading 提供了多线程编程的支持 本设计实现代码如下 this th new Thread new ThreadStart Serve 新建一个用于监听的线程 th Start 打开新线程 不仅仅是服务器 基于 P2P 模式聊天的客户端也必须支持多线程运行 实现代 码与之类似 在客户端设计说明中将不再叙述 4 3 3 计时器 计时器用于实现心跳报文的功能 服务器在启动以后就开始计时 每隔一定时 间就向所有连入的客户端发送信息 核心代码如下 用计时器检查客户端是否掉线 System Timers Timer aTimer new System Timers Timer aTimer Elapsed new ElapsedEventHandler CheckStatus 设置引发时间的时间间隔 此处设置为 5 秒 毫秒 aTimer Interval 5000 aTimer Enabled true CheckStatus 就是用于向客户端发送检查信息的方法 它会向遍历连入的 客户端 alSock 然后依次向客户端发送信息 如果发现客户端没有响应 就会 如果发现对方无回应 则关闭相应的 SOCKET 并更新数据库的用户在线状态 第 15 页 共 20 页 同时向该用户的所有好友发送用户已下线的通知 4 4 客户端 4 4 客户端 图 5 注册界面 图 6 登录 聊天 文件传输界面 4 4 1 同步套接字客户端 客户端发起同步套接字连接 并传送登录或者注册信息 由于两者方式类似 这里仅列出用户登录的代码 region 发送服务器登录信息 并接收服务器反馈信息 public void Client 建立 SOCKET 发送信息 try IPEndPoint ServerIPEP new IPEndPoint IPAddress Parse 222 18 170 16 8888 第 16 页 共 20 页 c new Socket ServerIPEP AddressFamily SocketType Stream ProtocolType Tcp c Connect EndPoint ServerIPEP s new MemoryStream translator Serialize s message byte d new byte s 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 以下代码读取了服务器返回给客户端的信息 注册和登录的成功与失败 如 果返回了登录成功的信息 还会读取服务器给出的 FriendStruct 结构以得到用户 的好友信息 region 接收反馈信息 byte data new byte 2048 while true int rect c Receive data byte chat new byte rect Buffer BlockCopy data 0 chat 0 rect UMessage bumessage UMessage translator Deserialize new MemoryStream chat string fg string fg bumessage Fg if bumessage Info 3 else if bumessage Info 11 fg fg Split int xxx bumessage Fn ff bumessage Fri for int i 0 i xxx i string ems new string 5 ems 0 ff i account ems 1 ff i nickname ems 2 fg int Parse ff i fg ems 3 ff i IP 第 17 页 共 20 页 ems 4 ff i status ListViewItem item new ListViewItem ems this 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 MessageBox Show 服务器未知错误 else MessageBox Show bumessage Info ToString endregion endregion 客户端之间的聊天同样使用了序列化的 XML 文档 用户在登录成功后就会 启动一个新的监听器去监听其它客户端传入的聊天信息并且进行判断再将其它 用户的聊天信息显示在界面上 这里也不再阐述代码 4 2 采用异步套接字的文件传输 文件传输是通过一个类库实现的 由于文件传输的代码实现复杂 通过类库 可以大量的简化代码 使主程序简洁易懂 类库 Infinity Networking 包括了 第 18 页 共 20 页 ClientBase cs ClientInfo cs Delegates cs INPClient cs INPServer cs ClientBase cs 定义了基础的文件发送函数 INPClient cs 则仅包含初始化文件 发 送的函数 ServerBase cs 和 INPServer cs 则是反之亦然 核心代码如下 ClientBase cs 这个类实现了套接字的开启和数据的传输 ClientBase cs 这个类实现了套接字的开启和数据的传输 using System using System Net using System Net Sockets namespace Infinity Networking ClientBase 摘要 public class ClientBase private const int BUFFERSIZE 4 1024 private int port private string serverIP private Socket mainSoc private ClientInfo info private AsyncCallback dataRecievedCallback 异步回调方法 public event NetworkEventHandler DataRecieved 定义一 个事件 接收到数据时引发事件 public ClientBase string serverIP int port serverIP serverIP port 11000 mainSoc new Socket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp info new ClientInfo mainS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论