




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
I 局域网即时通讯软件原型的设计与实现 摘 要 随着信息技术的迅速发展,在学校内部同学们对于传统的 u 盘传输文件已经不耐烦 了。在此背景下,本人采用.net 中的 C#语言开发了局域网即时通讯软件-Hcoze。本论文 首先考虑了同学们对局域网内部通信使用的实际要求,分析了此局域网即时通讯软件应 该具有的功能:主要包括用户上线、下线、发送聊天信息、接收聊天信息、发送文件、 接收文件等功能。其次对系统的主要功能模块进行了详细地描述。最后结合软件开发阶 段和调试阶段发现的问题,提出了软件需要完善的地方,总结了开发此软件所取得的经验 和体会。 关键词: 即时通信软件;C#语言;网络编程;TCP 编程;UDP 编程;线程 II The Design and Implementation of a LAN Instant Messenger Prototype Abstract With the rapid development of information technology,students in school are out of patient with using traditional Flash-disk to transfer files. Under this consideration,I use C#.net language to develop this LAN Instant Messenger called Hcoze. Firstly this paper considers the demand of students communicating within LAN, then analysis this software should have such functions: user logging in and off, sending and receiving messages, and sending and receiving files etc. Secondly this paper describes the development details of this software. At last,according to the problems founded while developing and debugging the software,this paper proposes further work and summarize the experience and to appreciate from experience based on developing the software. Keyword: LAN; Instant Messenger; C # language; Network programming; TCP programming; UDP programming; Thread III 目 录 1 绪 论 1 1.1 背景.1 1.2 本设计的应用及意义.2 1.3 论文主要工作.2 2 总体设计 3 2.1 软硬件环境 .3 2.1.1 C#语言的概述.3 2.1.2 .NET 的概述 3 2.1.3 TCP 协议和 UDP 协议 .3 2.2 局域网即时通讯软件-Hcoze 的模块功能设计.5 2.2.1 上下线模块 .6 2.2.2 聊天模块 .6 2.2.3 文件传输模块 .7 2.2.4 靠边停靠模块 .7 2.2.5 更换皮肤模块 .7 3 各个功能模块的具体实现 9 3.1 软件界面.9 3.2 软件功能实现.9 3.2.1 上下线模块.9 3.2.2 聊天模块13 3.2.3 文件传输模块16 3.2.4 靠边停靠模块17 3.2.5 更换皮肤模块18 5 总结与展望 .19 参考文献 .20 致 谢 .21 1 1 绪 论 近年来,以计算机技术和网络普及为标志的信息时代的到来,给人们的生活带来了 翻天覆地的变化。计算机和网络成为了人们生活不可或缺的部分,人们在学习、生活、 工作中的许多事项如今已经被计算机及网络技术所带来的各种虚拟道具替代。 新的事物同时也产生新的需求,在网络上许许多多的资源,同学与同学之间的资源 共享已经不再仅仅使用传统的 U 盘了,通过 FTP 共享,点对点软件 TransF 传输,腾讯 QQ 传输。但是上述方式各有各的不足:FTP 共享需要有服务器,而且服务器的性能要很高, 必须有人上传资源到服务器,其他用户才能够从服务器上得到该资源;点对点软件 TransF,这是一款非常棒的点对点文件传输软件,缺点是只能传输文件,不能够实时的 聊天;腾讯 QQ 能够实时的聊天,也能传输文件,不足之处是它需要经过外网,在速度上 大打折扣。 以上三种资源共享的方式满足不了同学们快速传输文件与即时聊天通讯的需求。本 文所描述的局域网即时通讯软件 Hcoze 是针对同学们对即时聊天通信与快速传输文件的 需求开发的,让同学们可以使用该软件在脱离外网的束缚情况下进行文件传输,聊天等 等便利。该局域网即时通讯软件-Hcoze 既是客户端,也是服务端,不需要单独的服务器 支持即可以运行。 1.1 背景 即时通信软件,从最早 ICQ,到腾讯的 QQ,一直发展到现在的 MSN、Google talk、 Skype、雅虎通,UC 等等。 人与人之间需要交流,从千百年前的信件通信,到后来的电话,人们经历的漫长的通 信转变过程,随着新技术的不断出现,基于网络的即时通讯软件不断与新技术相融合, 使得即时通讯软件的功能不断多元化,各类新应用逐渐丰富。最初即时通讯软件的主要 完成互联网上文本信息的传递,后来逐渐出现语音、视频信息传递,这些都主要集中于 互联网电脑之间。进一步发展的一个方向是超出互联网的范畴,实现跨网络的文本、音 视频信息的传递。 国内即时通讯发展趋势,如图 1- 1 所示1。 2 图 1- 1 国内即时通讯发展趋势图 1.2 本设计的应用及意义 本文的设计正是一个本着自我学习,巩固以往学习的知识的思想,把学到的东西应 用到实际的开发中,开发能够服务同学们的局域网即时通讯软件-Hcoze。让局域网即时通 讯软件原型-Hcoze 按照自己预定的想法和目的运作,一直是我人生的追求和梦想。我选 择读计算机,正是要加入计算机这个大家庭,吸收文化不断提高自己,不断的走近自己 的梦想,更好的为社会做出自己应有的贡献。 1.3 论文主要工作 本论文主要的工作就是通过对这个局域网即时通讯软件-Hcoze 开发中的设计思想与 实际如何实现当初目的和想法的阐述。 3 2 总体设计 本章主要通过文字对局域网即时通讯软件-Hcoze 设计过程中所使用到的技术平台进 行一定的介绍,并且对程序的总体设计规划进行详细的阐述。 2.1 软硬件环境 操作系统:Windows XP 开发语言:C# .NET Framework 版本 :.net Framework 3.5 开发工具:Microsoft Visual Studio 2008 内存要求:256M 或以上 2.1.1 C#语言的概述 C#(C Sharp)是微软(Microsoft)为.NET Framework 量身订做的程序语言,C#拥有 C/C+的强大功能以及 Visual Basic 简易使用的特性,是第一个组件导向(Component- oriented)的程序语言,和 C+与 Java 一样亦为对象导向(object-oriented)程序语言。 C#(C Sharp)使得程序员可以在 Microsoft 开发的最新的 .NET 平台快速地编写 Windows 应用程序,而且 Microsoft .NET 提供了一系列的工具和服务来最大程度地开发 和利用计算与通讯领域。 2.1.2 .NET 的概述 .NET 是一个用于建立应用程序的平台;它在内部封装了大量的功能强大的应用程序 接口函数(API),利用这些函数可以开发各类 Windows 应用软件;.NET 还是一个开发平台, 它向广大的程序员提供了功能强大的集成开发环境(IDE)Visual Studio.NET;在未来 .NET 还是一个运行,发布应用程序的平台,它可以将应用程序作为一种服务,通过 Internet 提供给分布在世界各个角落的网络用户.总之,.NET 是一个用来建立,开发,运 行和发布基于 Internet 的服务和应用程序的平台,.NET 是一门新的技术,同时也是一门 令人兴奋的属于 Internet 的技术。 2.1.3 TCP 协议和 UDP 协议 (1) TCP 协议 TCP:Transmission Control Protocol 传输控制协议 TCP 是一种面向连接(连接导 向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由 IETF 的 RFC 793 说明(specified)2。在简化的计算机网络 OSI 模型中,它完成第四层传输层所指 4 定的功能,UDP 是同一层内另一个重要的传输协议。 传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数 据前,必须先在双方之间建立一个 TCP 连接,之后才能传输数据。TCP 提供超时重发,丢 弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 TCP 连接的建立过程如图 2- 1 所示。TCP 协议通过三个报文段完成连接的建立,这个 过程称为三次握手(three-way handshake)。 TCP 连接的终止过程如图 2- 2 所示。建立一个连接需要三次握手,而终止一个连接 要经过四次握手,这是由 TCP 的半关闭(half-close)造成的。 图 2- 1 TCP 连接的三次握手图 2- 2 TCP 连接的终止 (2) UDP 协议 UDP 协议的全称是用户数据报协议,在网络中它与 TCP 协议一样用于处理数据包2。 在 OSI 模型中,在第四层传输层,处于 IP 协议的上一层。UDP 有不提供数据报分组、 组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否 安全完整到达的。UDP 用来支持那些需要在计算机之间传输数据的网络应用。包括网络 视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用 UDP 协议。UDP 协 议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但 是即使是在今天,UDP 仍然不失为一项非常实用和可行的网络传输层协议。 与所熟知的 TCP(传输控制协议)协议一样,UDP 协议直接位于 IP(网际协议)协 议的顶层。根据 OSI(开放系统互连)参考模型,UDP 和 TCP 都属于传输层协议。 UDP 协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就 是一个二进制数据的传输单位。每一个数据报的前 8 个字节用来包含报头信息,剩余字 节则用来包含具体的传输数据 (3) TCP 和 UDP 的区别 UDP 和 TCP 协议的主要区别是两者在如何实现信息的可靠传递方面不同2。 TCP 协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时, 会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信 息,否则将一直等待直到收到确认信息为止。与 TCP 不同,UDP 协议并不提供数据传送 的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不 5 能做出任何检测或提示。因此,通常人们把 UDP 协议称为不可靠的传输协议。 相对于 TCP 协议,UDP 协议的另外一个不同之处在于如何接收突法性的多个数据 报。不同于 TCP,UDP 并不能确保数据的发送和接收顺序。例如,一个位于客户端的应 用程序向服务器发出了以下 4 个数据报 D1 D22 D333 D4444 但是 UDP 有可能按照 以下顺序将所接收的数据提交到服务端的应用: D333 D1 D4444 D22 事 实上,UDP 协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有 可能发生。 总的来说,TCP 与 UDP 的区别有以下五点: 1)TCP 协议面向连接,UDP 协议面向非连接。 2)TCP 协议传输速度慢,UDP 协议传输速度快。 3)TCP 协议保证数据顺序,UDP 协议不保证。 4)TCP 协议保证数据正确性,UDP 协议可能丢包。 5)TCP 协议对系统资源要求多,UDP 协议要求少。 2.2 局域网即时通讯软件-Hcoze 的模块功能设计 本文所阐述的局域网即时通讯软件-Hcoze 适用于各高校同学们内部资源共享,脱离 外网的束缚进行网络聊天。用户使用该软件可以进行点对点的聊天与文件传输,从而达 到相互之间的沟通与资源共享。 该软件具有的功能有,上下线、聊天、文件传输、类似腾讯 QQ 靠边停靠、改变皮 肤等功能模块。程序占用资源程度恰当,运行稳定,引用第三方组件 IrisSkin2.dll3换肤 控件,界面上达到更加美观。 图 2- 3 模块示意图 6 2.2.1 上下线模块 该模块主要是软件的各个用户相互发现的主要模块。后面的聊天,文件传输都是以 这个模块作为前置条件的,只有用户上线了,本机客户端接收到用户在线的状态才能够 与对方进行聊天交流与文件传输。 2.2.2 聊天模块 聊天功能是 Instant Messenger 软件(以下简称 IM)最基本、也是最重要的功能,基 本上每一种 IM 软件在这个功能上的操作都差不多:如果用户想与联系人进行聊天,可以 双击 IM 中联系人的头像,在弹出的对话框中敲入文字信息发送即可。当然还有一些 IM 工具有自己的独特的文字聊天特点,腾讯 QQ 就可以给不在线的朋友发送信息,对方下次 上线的时候可以收到,MSN 不具备这样的功能该模块。当然在此局域网即时通讯软件- Hcoze 中也要实现这个模块,使用者可以通过双击用户列表中的用户头像打开一个新的窗 体来进行点对点的即时通讯。 聊天是点对点模式如下图 2- 4 所示 图 2- 4 点对点聊天模式示意图 2.2.3 文件传输模块 IM 软件能点对点的传输文件,有时候利用此功能要比使用 E-mail 还方便许多,当 然此项功能必须在对方在线时才能使用,所以该局域网即时通讯软件-Hcoze 也是实现文 件传输模块,用户之间点对点传输文件,让用户传递文件变的极其轻松快捷。 IM 的优点如下: 1.促进文件的共享(计算机程序或数据) 2.鼓励间接或者隐式的使用远程计算机 3.向用户屏蔽不同主机中各种文件存储系统的细节 4.使用 TCP 连接保证数据的可靠传输 2.2.4 靠边停靠模块 该模块使软件在靠近屏幕边缘时,如果鼠标不处于软件的区域能够自动的收缩到一 边。使用后感受到智能的感觉,不使用的时候会自动收缩,使用的时候自动伸展出来。 7 详细效果图请参照:图 2- 5 停靠前的效果图与图 2- 6 靠边停靠后效果图 图 2- 5 停靠前的效果图 图 2- 6 靠边停靠后效果图 2.2.5 更换皮肤模块 根据用户不同喜好更换不同的皮肤,使用户可以换上自己喜好的皮肤,使用起来更 加舒服。 详细效果图请参照:图 2- 7 换皮肤前效果图与图 2- 8 换肤后效果图 8 图 2- 7 换皮肤前效果图 图 2- 8 换肤后效果图 9 3 各个功能模块的具体实现 3.1 软件界面 图 3- 1 软件主界面图 3- 2 聊天对话窗口界面 软件主界面如图 3- 1 所示,聊天对话窗口界面如图 3- 2 所示。 3.2 软件功能实现 3.2.1 上下线模块 在程序启动的瞬间初始化本客户端的信息,包括状态,本机 IP,本机 MAC,本机登 陆用户名等等的相关信息,这个初始化动作由单独的类 GetLocalInformation 如图 3- 3 的 获取本机信息类图中的相关方法如来获取本机的相关信息,再到来 HuiUdp 中的 InitMyself()方法来实现,在初始化本客户端信息之后启动线程侦听远程客户端的消息, 在主窗体的 MainForm_Load()方法中启动,线程名字为:threadShowFriends,在 HuiUdp 中的 WhoOnline()方法中侦听的到的用户信息,通过 threadShowFriends 线程中的 ShowFriendsList()方法来显示相关的 user 对象信息。 实现思路,上线瞬间向网络上广播本机的信息与状态,如果对方收到了该广播,则 返回我在线的信息,通过线程侦听线程其他客户端返回信息。收到信息转到相关的函数 处理。收到一个新的用户,先对已有用户作对比,如果是已经存在的用户则不添加到用 户 List 中去,如果是新的用户,则添加到用户 List 中去,通过委托判断,将新用户显示 10 在第三方控件 SideBar.dll4上。 第三方 C#列表控件 SideBar.dll4 是一个支持像 QQ 列表一样的 C#控件 ,能够大图 标显示,小图标显示,列表显示,通过重绘能够是头像出现闪烁效果。正好符合此程序 的实际需求。 附上在上下线模块使用到的类。如下: 图 3- 3 上下线模块使用到的类视图 实现上下线的关键函数的分析: 在初始化函数 public static void InitMyself()中先 new 一个 User 对象出来之后 new 一 个 getLocalInformation 对象获取本机的信息赋值到 User 对象中去,相对应的是本机 Mac 地址赋值到 user.MacAddress 属性中,本机的机器名称赋值到 user.LocalUserName 属性中, 11 本机的登录用户名赋值到 user.LoginUserName 属性中,本机的 IP 地址信息赋值到 User.IPaddress 属性中,当所有 user 属性赋值完毕,将此 user 对象添加到静态类 DatasList 如图 3- 3 中数据列表类的 UserList 列表。 客户端上线函数 SendAliveAndAskWhoOline(IPAddress ipaddress)处于 HuiUdp 类中, 此函数的作用是用 Udp 协议发送一条带有本机信息的消息出去,当是本客户端上线发送 的消息的时候远程 Ip 为广播 IP,如果是回复远程用户询问消息,则设置远程 IP 为询问的 IP 地址。在函数的实现中,先使用 UdpClient myUdpClient = new UdpClient();创建一个 UdpClient 对象用于 Udp 通信。获得带有本机信息的消息用于发送到 UdpClient 的接收端, 定义自己的通信规则,第一个逗号前是用户状态,第二是用户登录名,第三个是用户的 头先 ID,第四个是用户的 MAC 地址,第五个是用户的主机名; 关键代码: bytebytes=System.Text.Encoding.UTF8.GetBytes(Myself.Status.ToString()+“,“+Myself. LoginUserName.ToString()+“,“+Myself.HeadId.ToString()+“,“+Myself.MacAddress.ToString() +“,“+Myself.LocalUserName.ToString(); 发送消息: myUdpClient.Send(bytes, bytes.Length, iep); 在这里使用到 trycatch(Exception ex)finally异常捕获函数,捕获此 Udp 通信可 能出现的异常。当出现了异常的时候,可以通过 MessageBox.show(ex.Message)的方式来 显示给用户知道。 监听有哪些客户端在线函数 public static User WhoOnline(),该函数作用是监听好友 状态,侦听到新的用户就返回侦听到的 User 到调用此函数的方法中去。该方法收到返回值 之后会根据预先的逻辑处理返回值。 在接收上线这个函数中,接收从远程主机发送过来的信息,在接收到信息之后使用 string message = str.Split(,)根据“,“来把信息分割开。这种分隔方式是根据自定义通信规 则,第一个逗号前是用户状态,第二是用户登录名,第三个是用户的头先 ID,第四个是 用户的 MAC 地址,第五个是用户的主机名来进行分隔的。分割完毕之后创建一个新的 User,把各个字段对应赋值到 user 中,最后把这个 user 返回到调用此函数的方法。 因为这个监听函数需要在主程序启动的时候就开启线程来出来此函数,所以会收到 自己广播出去的上线函数。在这里需要加一个判断,如果是收到的用户不在 DatasList 的 UserList 中则返回一个“我在线”的消息到对方。 实现代码: if (!CheckUserInUserList(user) HuiUdp.SendAliveAndAskWhoOline(user.IpAddress); 前面说到的只是实现上线下线模块中网络通信的部分,用户信息的发送与接收,但 是这个模块并不单止是这个网络通信就能够完成的,还有就是用户上线了,显示到第三 12 方控件 SideBar4中去如图 3- 4 所示 ,用户下线了从第三方控件 SideBar4中删除如 图 3- 5 所示 。这样的实现技术要点还是相当的多的,下面一一阐述如何实现这个需求。 图 3- 4 用户在线添加到 SideBar 图 3- 5 用户不在线从 SideBar 删除 在程序的主窗体创建时候会创建一个主线程用于调用监听用户状态改变的函数。创 建完线程后调用 HuiUdp 如 图 3- 3 的 UDP 通信类图中的 InitMyself 函数来初始化得到本 机的相关信息之后,将当前的本机的 User 对象添加到第三方 C#列表控件 SideBar4 中, 并且将此 user 对象添加到静态类 DatasList 如图 3- 3 的数据列表类图的 UserList 列表中。 收到 WhoOnline()函数返回的 user 对象先调用 CheckInFriendsLists(user)方法检查收 到的 User 对象时候存在 DatasList 如图 3- 3 的数据列表类图的 UserList 列表中,如果存在 的返回 True,不存在则返回 false,根据返回的结果可以知道 user 是否已经添加到第三方 C#列表控件 SideBar4 中了,尚未添加的,需要添加到列表中显示出来,否则什么都不干。 如果收到的 User 状态是“下线” ,则从 SideBar 列表中删除,删除过程是把 SideBar 中的所有 Item 都清空,而且把状态为“下线”的用户从 DatasList 中的 UserList 列表中删 除,执行上前两步的时候,重新从 DatasList 中的 UserList 列表中加载状态为“在线”的 用户信息到 SideBar4 中。 实现的关键代码: 添加 User 到 SideBar4 中: SbItem sbItemUser = new SbItem(user.IpAddress.ToString(), user.HeadId); this.sbFriends.Groups0.Items.Add(sbItemUser); sbItemUser.Tag = user; 下线功能 通过上线的功能函数把本机的状态信息更改为下线状态,广播到网络上的所有用户, 13 以便用户收到本机的下线通知。当用户收到下线状态的消息之后,通过委托判读,从第 三方控件 SideBar4上移除,并且从用户 List 中移除。流程跟上面所说的上线一样。 3.2.2 聊天模块 聊天功能对于 IM 来说是比较重要的一个功能,也是在这个局域网即时通讯软件- Hcoze 中要实现的几个功能之一。 图 3- 6 消息类型图 图 3- 7 聊天流程图 聊天模块的实现思路是如下: 在程序启动的瞬间启动线程 threadReciveMessage 调用函数 UdpReciveMessage() 监听远程用户发送过来的消息。在 UdpReciveMessage() 方法中调用 HuiUdp.ListenReciveMessage();接收远程用户发送过来的消息, 14 HuiUdp.ListenReciveMessage();无论收到怎么样的消息都会按照自定义的消息规则来拆分 不同的字段,每一条消息会创建一个 Information 对象,把拆分到的字段分别赋值到 Information 中的属性中,当赋值完毕之后,即返回这个 Information 对象到调用此函数的 UdpReciveMessage()去。 在 UdpReciveMessage()中会接收的不同的消息内容,消息的类型也可能不同,使 用 switch 语句来判读收到的消息类型,根据消息类型调用不同的功能函数去进行对消息 的处理。消息类型有几种如图 3- 6 所示。如果类型是 WindowsShake ,是窗体抖动消息 类型就调用 WindowsShake()函数处理,对用户的窗体抖动处理。寻找目标用户的聊天对 话窗体,通过委托函数对窗体进行抖动处理,使用户感觉到对方在提醒他。如果是其他 消息类型则转到函数 HandleCozeMessage(information)去处理这条消息,在 HandleCozeMessage(information)里面又有相关函数处理,具体的函数实现下面详细的述说。 在 HandleCozeMessage(information)收到传递进来的 Information 对象之后会对 Information 对象分解,new 一个 ChatForm,把 information 中的 user 对象赋值到 ChatFrom 的 tag,调用 CheckInFormLists(cf)去与 DatasList 的 ChatFormList 列表中的 ChatForm 对象 比较,看是否存在相同 Tag 的对象,如果存在返回 True,如果不存在则返回 False。根据 CheckInForm(cf)返回的结果进行处理,如果收到的结果是 False,表示该用户的聊天对 话窗体还没有打开,DatasList.InformationList.Add(information)方法把收到的这条 information 添加到 DatasList 的 InformationList 列表中。同时有一个 timer 在工作,通过两 重循环遍历 DatasList 的 InformationList 列表 information 对象与第三方控件 SideBar4 上的 Item,根据 information 对象中的 RemoteUser 与第三方控件 SideBar4 上的 Item 的 tag 是 否一致,如果一致通过更换 Item 的图像,不停的重绘,达到头像闪烁效果,以便通知对 方打开聊天对话窗口进行聊天。 头像闪烁效果图如图 3- 8 与图 3- 9 所示。 15 图 3- 8 闪烁效果图 1 图 3- 9 闪烁效果图 2 当用户双击了第三方控件 SideBar4 上的 Item 上的用户 Item 头像(如图 3- 10 中的 99 的头像)的时候先通过 CheckInFormList(Form cf)检查是否在 DatasList 中的 ChatFormList 存在这个对象,如果存在则聚焦到该窗体,并且把 Information 对象中的 Message 属性的内容显示到聊天对话窗体中如图 3- 11 所示,直接在原来消息的末尾换行 追加显示出来。如果不存在则 new 一个新的聊天对话窗体出来用于聊天对话,并且把此 ChatForm 添加到 DatasList 中的 ChatFormList 去,在显示这个聊天对话窗体的时候先遍 历 DatasList 中的 InformationList 列表,查看所有未读消息。如果存在未读消息,则通过 委托函数来将未读消息显示到 ChatForm 中的 RichText 文本显示区域中如图 3- 11 所示。 若没有存在未读消息则直接把 ChatForm 窗体显示出来。 图 3- 10 聊天效果图 1图 3- 11 聊天效果图 2 在这里需要阐述一下为什么需要创建 DastsList 这个类,创建这个类是为了保存已有 16 的 User 对象、已经在使用的聊天对话窗体、未读消息。保存已有 User 对象是为了在上下 线模块中检测用户是否需要添加到第三方控件 SideBar4 上,保存在使用的聊天对话窗体, 是防止重复的 new 出很多个聊天对话窗体,这样能够保证一个 User 对象只有一个聊天对 话窗体。未读消息的保存是为了可以通过 timer 来实现对第三方控件 SideBar4 上 Item 的头像闪烁效果,以便通知用户需要打开聊天对话窗体查看消息。 图 3- 12 发送热键 在聊天对话这个模块,可以通过图 3- 12 发送热键设置两种热键发送,当选择按 Enter 键发送的时候,输入完内容可以直接按 Enter 键就能够把消息发送到对方去,如果 选择另外一种,同样输入完内容之后按 Ctrl+Enter 键就能够把消息发送出去。 上述功能,在 ChatForm 窗体的类中定义一个全局变量 isCtorlAndEnter 记录用户的 选择,从 txtSendInput_KeyDown 事件去捕捉键盘事件,如果触发是用户选择的发送模式, 则发送消息出去。 3.2.3 文件传输模块 局域网即时通讯软件-Hcoze 中的文件传输模块是继聊天模块之后的第二重要模块。 17 图 3- 13 点击发送文件图 图 3- 14 提示是否接收文件图 图 3- 15 打开文件选择对话框图 图 3- 16 发送文件流程图图 3- 17 监听文件发送请求流程图 实现思路: 在程序启动的时候创建线程 Thread t = new Thread(new ThreadStart(CreateTcpListenerForRequest); 在指定的端口 8808 上监听文件发送请求信息, 当收到请求信息的时候显示是否允许对方发送文件的对话框如图 3- 14 所示,如果用户点 击“是”按钮的会返回能够发送文件的信息,并开启监听接收文件线程在指定的端口 18 8809 上监听,使对方能够建立 Tcp 连接进行文件发送,否则发送拒绝接收文件信息,告 诉用户对方拒绝接收文件请求,请与对方联系。 在聊天窗体中点击发送文件按钮如图 3- 13 所示,显示选择文件路径对话框如图 3- 15 所示 出来让用后能够选择自己要发送的文件,点击打之后,建立 Tcp 连接到对方的侦 听时候接收文件端口,发出询问消息等待对方的回答,对方会收到如图 3- 14 所示这样的 提示。在收到对方允许发送文件的信息之后通过 TcpClient 与对方指定的端口 8809 上的 TcpListener 建立连接,进行文件传输,同时通过委托函数进传输进度显示到进度条中。 如果收到的信息是拒绝接收文件则弹出提示框提示用户对方拒绝接收发送的文件。 发送文件的代码阐述: 在用户选择文件之后使用变量 fileSendPath 来保存要发送文件的路径,通过 StringBuilder sb = new StringBuilder();sb.Append(this.fileName);sb.Append(“:“); sb.Append(fileSize.ToString(); 这样来构造信息发送到对方,让对方可以知道需要发送过 来的文件名与文件的大小,从而判断是否接收文件。这里需要用“:”来作为信息的分 隔点,是因为文件名不可能包含“:”这样的字符。对方可以准确无误的得到文件的信 息。 在得到能够发送文件的返回结果之后,先是建立 Tcp 连接,连接的端口是对方的监 听端口 8809,这里是使用 trycatch(exception ex)finally来捕获异常,进行异常出来, 防止连接不成功造成程序的崩溃。连接成功之后,根据 fileSendPath 获取文件的路径,使 用 FileStream 来获取文件流进行发送,因为不可能一次性把整个文件发送完毕,所以需要 分段来发送,定义数据缓冲区,每次读取文件按照数据缓冲区的大小来读取文件。这里 使用了 while 循环,循环判断条件是把文件读完,一边读一边把文件发送。同时通过委托 函数来设置进度条,让用户能够看到发送文件的进度。 在接收文件一方,当对方建立了连接之后。调用单独的接收文件线程来接收文件, 不断的从网络流中接收发送过来的文件,知道网络流上信息读取完毕,这时候文件已经 接收完毕,弹出提示框,提示文件接收完毕。 无论在发送文件发送请求、发送文件,接受文件的哪一个操作都需要创建线程来处 理,这样的做法是防止程序进入假死状态,在进行这些操作的同时用户还可以进行其他 操作。 3.2.4 靠边停靠模块 该模块使软件在靠近屏幕边缘时,如果鼠标不处于软件的区域能够自动的收缩到一 边。使用后感受到智能的感觉,不适用的时候会自动收缩,使用的时候自动伸展出来。 实现思路:通过 timer 来判读窗体的位置跟鼠标的位置,对位置的信息进行处理来 实现隐藏窗体跟伸展窗体。 窗口在靠边前没有停靠的时候状态图如图 2- 5 所示。 19 窗体在靠边停靠之后的状态图如图 2- 6 所示,整个程序界面隐藏起来,当鼠标靠近 的时候才恢复出来。 3.2.5 更换皮肤模块 根据用户不同喜好更换不同的皮肤,使用户可以换上自己喜好的皮肤,使用起来更 加舒服。 实现思路,引用第三方皮肤控件 IrisSkin2.dll3,使用户可以个性定制自己喜好的皮 肤。 图 3- 18 进入我的资料设置 图 3- 19 选择皮肤 在用户点击头像旁边的图标会显示如图 3- 18 再点击我的资料,即显示图 3- 19 界面, 在 ComboBox 列表中显示了可以选择的皮肤,在代码里面是使用直接添加不同的皮肤描 述到 ComboBox 的 Item 去,不同的皮肤对应 comboBox1.SelectedIndex 的值不一样,当 comboBox 选择好了之后,得到对应的 SelectedIndex 值,根据 selectedIndex 的值给全局变 量 MainForm.skinFilePath 赋值。这个全局变量是第三方皮肤控件 IrisSkin2.dll3 的皮肤路 径。然后在关闭 ChangeSkin 窗体的时候调用方法使 this.skinEngine1.SkinFile = skinFilePath; 这样就可以实现了根据用户自己选择喜爱的皮肤来作为局域网即时通讯软件-Hcoze 的皮肤了。 效果如 Error! Reference source not found.与 Error! Reference sourc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 诊室患者安全管理制度
- 诊所新风设备管理制度
- 试件标准养护管理制度
- 财务签字审批管理制度
- 财政扶贫项目管理制度
- 货品安全配送管理制度
- 货物运输变更管理制度
- 货车司机仓库管理制度
- 物资采购沟通协议书范本
- 护理心理学案例分析 课件
- DB37∕T 5323-2025 住宅设计标准
- 2024年6月英语四级真题(全3套)
- MySQL数据库技术单选题100道及答案
- 《肝衰竭诊治指南(2024版)》解读
- 防暑应急救援演练脚本
- 2023-2024学年江西省吉安市高二下学期期末教学质量检测数学试题(含答案)
- 24秋国家开放大学《计算机系统与维护》实验1-13参考答案
- 100以内进退位加减法口算题(20000道 可直接打印 每页100道)
- GB/T 5656-2008离心泵技术条件(Ⅱ类)
- 静态存储器介绍
- 药品不良反应报告表范例
评论
0/150
提交评论