毕业设计局域网即时通信软件设计.doc

上传人:laozhun 文档编号:3974969 上传时间:2023-03-30 格式:DOC 页数:39 大小:326.50KB
返回 下载 相关 举报
毕业设计局域网即时通信软件设计.doc_第1页
第1页 / 共39页
毕业设计局域网即时通信软件设计.doc_第2页
第2页 / 共39页
毕业设计局域网即时通信软件设计.doc_第3页
第3页 / 共39页
毕业设计局域网即时通信软件设计.doc_第4页
第4页 / 共39页
毕业设计局域网即时通信软件设计.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《毕业设计局域网即时通信软件设计.doc》由会员分享,可在线阅读,更多相关《毕业设计局域网即时通信软件设计.doc(39页珍藏版)》请在三一办公上搜索。

1、局域网即时通信软件设计毕业论文(设计)任务书院(系):文经学院姓名 学号 毕业届别2009专业通信工程毕业论文(设计)题目局域网即时通信软件设计指导教师 学历工学硕士职称副教授所学专业控制科学与工程主要内容:基于Socket的局域网聊天系统是WinSock点对点通信的具体实例之一,它很好的诠释了Socket通信的原理,并且在学校、企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点,所以局域网即时通信系统软件的开发具有很高的实用价值。基本要求:1. 完成该软件主要功能的开发设计; 2. 软件在不同计算

2、机上均能调试通过。主要参考资料: 1 Karli Watson C#入门经典第四版.清华大学出版社,20082Christian Nagel C#高级编程第四版.清华大学出版社,20063 James Huddleston C#数据库入门经典第四版.清华大学出版社,2008进度安排:第4周末, 确定论文题目; 第7周末, 提交论文提纲; 第11周, 提交论文初稿; 第15周, 提交论文终稿并准备答辩。指导教师(签字): 年 月 日院(系)意见: 教学院长(主任)(签字): 年 月 日备注:摘 要 即时通信在互联网领域的应用取得了巨大的成功,但是在学校、企业内部的应用仍远未普及。鉴于即时通信作为

3、一项有广泛应用价值的技术框架,在逐步适应企业网络、教育网络的应用特点后,局域网即时通信必将取得和电子邮件一样的普及效果。该系统使用.NET作为开发平台、Mysql数据库存储用户信息和聊天记录,用套接字连接客户端和服务器,用数据包套接字发送消息。本系统采用C/S模式构建,由客户端和服务器端组成。客户端只要填写服务器的IP地址和通信端口号,并通过所分配的账号,就可以登录和使用。服务器与Mysql数据库可部署在同一网段的任一节点上,通过接收客户端不同请求而对数据库进行增删改查的操作,这样就可以方便的进行维护并且保证了同一局域网信息的安全和网络资源的充分利用,并且最大程度的保证了数据库的安全性。使用该

4、系统可进行一般的文字交流,查询聊天记录,及在线用户显示等功能。关键词 .NET Framework;Socket;多线程;Mysql数据库;TCP/IP协议;ADO.NET Abstract Instant messaging applications on the Internet were a great success, but in schools, enterprises are still far from universal in application. In view of instant messaging applications as the value of a br

5、oad technical framework, and gradually adapt to the corporate network, the application of the characteristics of the education network, the LAN access to instant messaging and e-mail will be the same universal effect.The introduction of the system. NET as a development platform, Mysql database stori

6、ng user information and chats with a socket connection client and server, and send a message packet socket. The system uses C / S mode of construction, from the client and server-side component. Simply fill out the client server IP address and communications port number, and through the distribution

7、 of the account, you can log in and use. Mysql database server and can be deployed in the same network segment at any node, by receiving the request of the client different additions and deletions to the database search operation,This can be convenient for maintenance and to ensure that the same loc

8、al area network information security and make full use of network resources and ensure maximum safety of the database. The system can be used for general exchange of text, query chats, and online user functions.Key words .NET Framework; Socket; Thread; Mysql Database; TCP/IP; ADO.NET目 录前言11.课题及开发平台简

9、介11.1 课题介绍11.2 开发平台简介11.3 编程语言简介(C#)21.4主要设计功能42.数据库设计及基本实现原理52.1 数据库设计52.1.1 class表简介52.1.2 user表简介52.1.2 chatlog表简介62.2 基本实现原理72.2.1 WINSOCK接口72.2.2客户机/服务器模式72.3 二者的结合(DBA)83.客户端编程实现103.1 用户登陆功能103.1.1 连接服务器113.1.2 开启新线程用于接收服务器发回的消息113.1.3 向服务器发送用户名与密码信息113.2 接收服务器发回的指令123.2.1 接收发回的原始消息并还原123.2.2

10、分析处理服务器发回的指令123.3 登陆后界面初始化123.3.1 验证成功与进入主界面123.3.2 初始化用户列表133.3.3 显示在线用户153.4 聊天功能163.4.1 发送消息163.4.2 接收消息183.5 查询聊天记录功能193.6 用户离线223.6.1 发送离线请求223.6.2 接收用户离线消息223.7 报错功能234.服务器端编程实现244.1 启动服务244.1.1 声明变量244.1.2 显示服务器IP244.1.3 启动服务244.1.4 监听客户端请求254.2 接收客户端请求264.3 根据客户端不同请求做出操作264.3.1 连接请求274.3.2 即

11、时聊天请求294.3.3 查询聊天记录请求304.3.4 用户离线请求304.4 即时发送“错误”指令315.结论326.致谢33参考文献34前言由于因特网的迅速流行,越来越多的应用程序具备了在网上与其它程序通信的能力。从WIN95开始微软把网络功能融进了它的操作系统,使得应用程序网络通信能力更为普及。因此,微软的TCP/IP协议也就成为网络应用程序基于的首选协议。一般采用TCP/IP协议的应用程序只实现了单用户与服务器间点对点的连接,而本文在VC6.0的环境下,运用了了多线程以及共享数据结构技术,不仅实现了多用户与服务器间的连接,而且解决了多用户间信息互发问题-依靠服务器的转发功能。并且,数

12、据库技术的引入,使得大数据保存成为了可能,并可在任意客户端查询聊天记录。借助微软Visual Studio2008 .NET开发平台,与其自带的ADO.NET组件,使开发效率大大提速。1.课题及开发平台简介1.1 课题介绍局域网即时通信,不同于大家熟知的MSN这样的基于互联网的即时通信,而是基于学校教育网、企业内部局域网使用的即时通信。即时通信在互联网领域的应用取得了巨大的成功,但是在学校、企业等内部网络的应用仍远未普及。传输速度、总体投入及广域网无法比肩的安全性,注定了局域网层出不穷的潜力,在学校、企业内部更是如此。在这种前提下,一款可以即时收发消息用来收发通知,可查询历史消息的通信软件的需

13、求成为了必然。正是在这种前提下,结合实际情况,我决定开发一套局域网即时通信软件设计软件。1.2 开发平台简介.NET Framework 是微软的几个开发团队一起努力发展的成果,最主要用来产生一个可以用来快速开发、部署网站服务及应用程序的开发平台。作为微软公司继WindowsDNA以来的新的开发平台。.Net Framework是以一种类似于Java系统的虚拟机方式运行和管理的编程平台,通过CLR为基础,支持多种语言(C#、VB.NET、C+、Python等)的开发。C#是一种安全的、稳定的、简单的,由C和C+衍生出来的面向对象的编程语言。它在继承C和C+强大功能的同时去掉了一些它们的复杂特性

14、(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视化操作和C+的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。 在Visual Studio 2008的C+语言当中,MFC可以支持Vista的通用控件。Visual Studio 2008还支持智能感应,除此以外,对于AJAX引入了很多扩展控件,从而可以快速开发ASP.NET AJAX的应用。新的Vista SDK中包含大量的非托管API。UAC(用户访问控制)是Vista的一种访问控制机制,主要是防止病毒对系统的破坏。使用Visual Studio 2008可以

15、高效开发Windows应用。设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。同时Visual Studio 2008支持项目模板、调试器和部署程序。使用Expression交互式设计器可以无缝集成设计人员与开发人员的工作流程。LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询。LINQ的目标是降低访问数据的复杂度。LINQ可以用统一的方法访问不同类型的数据,可以将数据作为对象使用,能够更好地与编程模型集成,可以在Visual Studio 中进行智能提示。1.3 编程语言简介(C#)1.面向对象的可视化编程方法:用传统程序设计语言设计程序时,大都是

16、通过编写程序代码来实现用户界面,在设计过程中看不到界面的实际显示效果,必须编译后运行程序才能观察,这很麻烦,大大影响了软件开发的效率。C#则是应用的面向对象的程序设计方法(OOP),提供了可视化的设计方法,它把程序和数据封装起来作为一个对象,并为每个对象赋予应有的属性,使对象成为实在的东西。开发人员不必再为界面设计而编写大量程序代码,也不需要通过一遍遍编译来修改不满意之处了。只要按设计要求的屏幕布局,用系统提供的工具,在屏幕上画出各种“部件”,即图形对象,并设置这些图形对象的属性,就可以轻松完成任务了。C#会自动产生界面设计代码,程序设计人员不必再手工编写实现程序功能的那些烦人的代码,从而可以

17、大大提高程序设计的效率。2.结构化程序设计语言:C#是在C/C+语言的基础上发展起来的,具有高级程序设计语言的语句结构,接近于自然语言和人类的逻辑思维方式。C#语句简单易懂,其编辑器支持彩色代码,可自动进行语法错误检查,同时具有功能强大且使用灵活的调试器和编译器。C#是面向对象型语言,在输入代码的同时,解释系统将高级语言分解翻译成计算机可以识别的机器指令,并判断每个语句的语法错误。在设计C#程序的过程中,随时可以运行程序,而在整个程序设计好之后,可以编译生成可执行文件(.EXE),脱离C#环境,直接在Windows环境下运行。3.事件驱动编程机制:C#通过事件来执行对象的操作。一个对象可能会产

18、生多个事件,每个事件都可以通过一段程序来响应。例如,命令按钮是一个对象,当用户单击该按钮时,将产生一个“单击”(CLICK)事件,而在产生该事件时将执行一段程序,用来实现指定的操作。在用C#设计大型应用软件时,不必建立具有明显开始和结束的程序,而是编写若干个微小的子程序,即过程。这些过程分别面向不同的对象,由用户操作引发某个事件来驱动完成某种特定的功能,或者由事件驱动程序调用通用过程来执行指定的操作,这样可以方便编程人员,提高效率。4.访问数据库功能:C#具有强大的数据库管理功能,利用数据控件和数据库管理窗口,可以直接建立或处理Microsoft SQL Server 2005 Express

19、格式的数据库,并提供了强大的数据存储和检索功能。同时,C#还能直接编辑和访问其他外部数据库,如:DATABASE,FoxPro,Paradox等,这些数据库格式都可以用C# 编辑和处理。C#提供开放式数据连接,即ADO.NET功能,可通过直接访问或建立连接的方式使用并操作后台大型网络数据库,如SQL Server,Oracle等。在应用程序中,可以使用结构化查询语言SQL数据标准,直接访问服务器上的数据库,还提供了简单的面向对象的库操作指令和多用户数据库访问的加锁机制和网络数据库的SQL的编程技术,为单机上运行的数据库提供了SQL网络接口,可以在分布式环境中快速而有效地实现客户/服务器(cli

20、ent/server)方案。5.动态数据交换(DDE)功能:利用动态数据交换(Dynamic Data Exchange)技术,可以把一种应用程序中的数据动态地链接到另一种应用程序中,使两种完全不同的应用程序建立起一条动态数据链路。当原始数据变化时,可以自动更新链接的数据。C#提供了动态数据交换的编程技术,可以在应用程序中与其他Windows应用程序建立动态数据交换,在不同的应用程序之间进行通信。6.对象的链接与嵌入(OLE)功能:对象的链接与嵌入(OLE)将每个应用程序都看作是一个对象(object),将不同的对象链接(link)起来,再嵌入(embed)某个应用程序中,从而可以得到具有声音

21、、影像、图像、动画、文字等各种信息的集合式的文件。利用OLE技术,可以方便地建立复合式文档(compound document),这种文档由来自多个不同应用程序的对象组成,文档中的每个对象都与原来的应用程序相联系,并可执行与原来应用程序完全相同的操作。Visual Basic就采用了OLE技术。7.动态链接库(DLL)功能:C# 是一种高级程序设计语言,不具备低级语言的功能,对访问机器硬件的操作不太容易实现。但它可以通过动态链接库技术将C/C+或汇编语言编写的程序加入到C# 应用程序中,可以像调用内部函数一样调用其他语言编写的函数。此外,通过动态链接库,还可以调用Windows应用程序接口(A

22、PI)函数,实现SDK所具有的功能。1.4主要设计功能本程序需要具备以下功能:用户密码验证功能;与在线用户进行即时通信交流;保存与离线好友交流文字信息功能;显示所有好友在线和离线功能;查询聊天记录功能;2.数据库设计及基本实现原理2.1 数据库设计在Mysql中建立名称为client的数据库,并在此数据库中创建chatlog、class、user三个数据表分别用来存放聊天记录、存放班级信息和存放用户信息。以下为对各个数据表的详细说明。2.1.1 class表简介class数据表设计视图如表2-1所示:表2-1 class表classBMclassNAME0541文通05410542文通0542

23、0441文通04410442文通04420431文通0431如上表所示,class表共有classBM、classNAME两个字段,分别存放班级编码和班级名称,并且必须一一对应。在设计程序中的好友列表中,作为所有学生的根节点。在好友列表显示时,可根据学生所属班级进行方便快速的查找。所有学生必须只属于一个班级编码下,否则不能正常显示。此表由服务器所在电脑维护。2.1.2 user表简介user数据表设计视图如表2-2所示:表2-2 user表idnamepasswordclassBM1Tom111105422Key222205413Yuki333305414张三444404315李四555504

24、42 user表共有id、name、password、classBM四个字段,分表用来存放用户id、姓名、密码、班级代码。id字段为此数据表主键,不允许重复,作为用户的唯一标示。可自动生成。name字段为学生的姓名信息,可通过它登录系统。password字段为此用户的密码,最多可维护进15个字符。在系统登录时,填写的姓名与密码必须同时验证成功才能正确的登录系统。classBM字段为学生所属班级代码,每条学生信息必须维护此字段,否则无法在用户列表中正确显示。2.1.2 chatlog表简介chatlog表视图如表2-3所示:表2-3 chatlog表FROMUSERTOUSERDATETIMEN

25、LOGSKey张三09053003234351你好张三Key09053005234521哈喽Tom王二09053008443213测试1Tom张三09053008452313测试2王二Key09053009553234测试3Yuki王二09053002113452测试4张三Tom09053001235252测试5chatlog表共有FROMUSER、TOUSER、DATETIMEN、LOGS四字段,分表存放聊天记录的发送方、接收方、时间、内容。FROMUSER字段为聊天记录发送方姓名,与表2中name字段外键关系,所以必须为user中用户名称一致。TOUSER字段为聊天记录接收方姓名,与表2中

26、name字段外键关系,所以必须为user中用户名称一致。DATETIMEN字段为聊天记录在服务器中转的时间(精确到毫秒),此字段与FROMUSER、TOUSER字段共同作为此表的主键,保证了每条记录主键不冲突。LOGS此字段用以存放聊天记录,字段数据类型为TEXT,所以可轻松用于可进行大数据编辑。2.2 基本实现原理2.2.1 WINSOCK接口WINSOCK标准定义了一个DLL接口,通常叫做WINSOCK.DLL或者WSOCK32.DLL。无论机器上安装了哪一个DLL,只要函数的名字,参数含义以及最终的功能是相同的,应用程序就可以调用这些函数。在插口编程里一个重要的概念就是一个插口的端口。局

27、域网内的每一个站点都有一个数字地址称为IP地址,通常是由“.”分开的四个数。在机器上运行的程序可以随心所欲地用端口与其他机器进行通信。多数端口的工作是基于连接的:两个程序在每一端用一个端口形成一个连接,然后沿着该连接收发数据。有些应用程序倾向无连接地发送,但是这些数据的到达是没有保障的。 WINSOCK.DLL实际上是作为WinSock应用程序和TCP/IP协议栈之间的中间层。用户的应用程序告诉WINSOCK.DLL需要做什么,WINSOCK.DLL将这些命令传送到TCP/IP协议栈,由TCP/IP协议栈传送到网络。但是重要的事情是用户必须注意用户使用的WINSOCK.DLL必须和TCP/IP

28、的版本号一致。2.2.2客户机/服务器模式由于Winsock支持多种协议上的网络程序开发, 比如TCP、UDP、和IP等等。由于这次课程设计是实现点到点的可靠连接,所以在此使用TCP连接方式。在这个连接中,双方分为客户和服务器,他们各自的功能不同。客户机一方,TCP/IP应用程序功能如下:(1) 打开通信信道(申请一套接字),并连接到服务器在主机的保留端口,该端口对应服务器的TCP/IP进程。(2) 向服务器发出请求报文,等待接收应答。(3) 从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。服务器一方,TCP/IP应用程序动作如下:(1) 打开通信信道(申请一套接字),通知

29、本地主机在某一保留端口接收客户机请求。(2) 等待客户请求到达指定端口。(3) 接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信链路。(4) 继续等待客户机请求。(5) 如果不想响应客户机请求,关闭服务器进程。综上所述,TCP/IP应用中的服务器程序必须先于客户机进程启动,直到对客户机的响应结束或强迫终止。其面向连接的应用程序流程图如图2-1。图2-1 C/S模式2.3 二者的结合(DBA)1.与C# 的连接:C# 提供了与底层数据库系统紧密的连接。它支持不同的关系数据库管理系统并充分发挥每一个数据库的特长,生成独立应用或脱离服务器运

30、行的应用程序。C# 连接数据库的方式有两种:方式一,通过使用C# 的 DATA控件;方式二,通过使用由C# 提供的专用的直接与数据库相连的接口。2.Mysql驱动与DATA 控件的桥梁作用: 使用Mysql公司的.NET驱动包mysql-connector-net-6.0.3,并引用驱动包内已编译好Mysql类组件,便可以更方便的在VisualStudio2008中操作Mysql数据库。DATA在数据库中的信息与将信息显示给用户看的C# 程序之间架起了一座桥梁。我们可以设置DATA控件的各个属性,告诉它要调用哪个数据库的哪个部分。缺省情况下,DATA控件根据数据库中的一个或多个数据表建立一个d

31、ynaset-type(动态集合)类型的记录集合。一个记录集合是动态的也就意味着,当原来的数据表中的内容改变了以后,该记录集合中的记录也会随之改变。DATA控件还提供了用来浏览不同记录的各种跳转按钮。将DATA控件放置在窗体中之后,我们还必须在该控件与要处理的数据库之间建立联系。3.客户端编程实现客户端安装在与服务器同一局域网的任意一台计算机上,用户通过正确用户名与密码便可登录,并进行与服务器或者其他客户端的即时通信。下面将对客户端的各功能进行介绍:3.1 用户登陆功能登陆界面如图3-1所示:图3-1 登陆界面图账号文本框:填写用户名;密码文本框:填写用户密码;服务器IP框:填写服务器所在计算

32、机的局域网IP地址;服务器端口文本框:填写服务器所开此服务的端口号,本系统缺省默认为服务器的“1234”端口。3.1.1 连接服务器使用类:System.Net.Sockets.TcpClent为TCP网络服务提供客户端连接,类: System.Net.Sockets.NetworkStream提供用于网络访问的基础数据流。声明为全局变量代码如下: TcpClient tcpClinet;/与服务器的连接(客户端) private NetworkStream stream;/与服务器数据交互的流通道将用户名、密码、服务器IP、服务器端口号填写完成后,点击登陆按钮,将实例化TcpClient类的

33、新实例,并使用指定的IP地址与端口号将客户端连接到TCP主机。代码如下: tcpClinet = new TcpClient(); tcpClinet.Connect(IPAddress.Parse(txtServerIP.Text), Int32.Parse(txtDK.Text);/连接远程服务器其中txtServerIP.Text为服务器IP文本框内容 txtDK.Text为服务器端口号文本框内容。然后返回用于发送和接收数据的NetworkStream: stream = tcpClinet.GetStream();3.1.2 开启新线程用于接收服务器发回的消息在计算机的同一线程内同时处

34、理发出与接收的消息是没有保证的,所以编写Incept()函数来接受服务器的请求。并开启另外一个线程,用于接收服务器发回的消息,并作出相应的处理。声明新线程,并启动,代码如下: ThreadStart incept = new ThreadStart(this.Incept); Thread thread = new Thread(incept); thread.Start();3.1.3 向服务器发送用户名与密码信息因为用于网络访问的基础数据流的数据类型为字符编码,所以将用户名与密码转化为字符编码数组,然后写入基础数据流NetworkStream,服务器便能接收到消息。创建字符串,以“CON”

35、作为前缀,并以“|”符号将用户名与密码隔开,以便服务器进行分析,代码如下: string userName = txtID.Text.ToString(); string cmd = CON| + userName+ | + txtPASSWORD.Text + |;消息格式为:“CON|用户名|密码|”。然后将此字符串转化为字符编码数组,并写入NetworkStream,代码如下: Byte outbytes = System.Text.Encoding.Default. GetBytes(cmd.ToCharArray(); stream.Write(outbytes, 0, outbyt

36、es.Length);/将指令发送给服务器 若经服务器验证无误后,便会发回验证成功的指令,客户端进入系统。3.2 接收服务器发回的指令在新的线程内,启动接收函数,接收服务器发回的不同信息,并判断、处理。以便客户端进行不同的操作。3.2.1 接收发回的原始消息并还原因为服务器发回的指令同样为字符编码数组,所以先声明一个Byte类型的数组,用以接收服务器的原始信息: byte buff = new byte10000000; int len;/消息长度 len = stream.Read(buff, 0, buff.Length);然后将收到的原始指令还原为字符串格式: String msg= S

37、ystem.Text.Encoding.Default.GetString(buff, 0, len);3.2.2 分析处理服务器发回的指令因为服务器发回的消息与客户端发出的消息类似,都是以指令名称作为前缀,并以“|”符号作为分隔符,所以,声明一个字符串型数组,并把消息内以“|”符号隔开的各字符串放入此数组中: string token = msg.Split(new Char | ); 在token0内放置的便为消息指令的标示符。这样,可以通过对token0内字符串的判断达到分析指令的目的。3.3 登陆后界面初始化3.3.1 验证成功与进入主界面在密码验证成功后,服务器将返回登陆成功消息,消

38、息格式为:“EnterOK|”。客户端接收此消息,处理后,一个字符串数据类型的数组,客户端经判断后,如上消息,进行相应操作,代码如下: If (token0 = EnterOK) groupBox1.Dock = DockStyle.Fill; btnEnter.Enabled = false; 系统转到用户操作界面并将“确定”按钮冻结,防止多次向服务器发送连接指令,引发“此用户已登录”错误。操作界面如图3-2所示:图3-2 系统主界面3.3.2 初始化用户列表进入主界面后,首先会收到服务器发送的用户列表,其原始消息的本身为一个DataSet,接收后将其还原: /创建内存流 MemoryStr

39、eam memStream = new MemoryStream(buff); memStream.Seek(0, SeekOrigin.Begin);/指定开始位置 /产生二进制序列化格式 IFormatter formatter = new BinaryFormatter(); /反串行化到内存中 object obj = formatter.Deserialize(memStream); /类型检验 if (obj is DataSet) DataSet DS = (DataSet)obj; 此时,DataSet的新实例DS中的USERLIST表中。接下来将用户列表展示在主界面上(将DS

40、中USERLIST表内数据展现在主界面上TreeView控件中)。因为此操作为跨线程操作,所以首先声明一个委托,用于把DataSet中的内容展现在TreeView控件上,并设置头像为不在线状态,委托于展现函数如下所示: private delegate void SetUsersListDel(DataSet dsList);/用于在TreeView中展示所有用户 private void SetUsersList(DataSet dsList) this.Invoke(new SetUsersListDel(SetAllUsersList),new objectdsList); privat

41、e void SetAllUsersList(DataSet dsList) foreach (TreeNode tn in treeView1.Nodes) foreach (DataRow dr in dsList.TablesUSERLIST.Rows) if (drclassBM.ToString() = tn.Tag.ToString() TreeNode tnChild = new TreeNode(); tnChild.Text = drNAME.ToString(); tnChild.Tag = drID.ToString(); tnChild.ImageIndex = 4; tn.Nodes.Add(tnChild); 接收进程中调用此委托的代码如下: if (DS.Tables0.TableName = USERLIST) SetUsersList(DS);/主进程委托,用于在窗体TreeView中展现DS 3.3.3 显示在线用户当有新用户上线时,服务器便会将所有的在线用户列表发送给包括此用户在内所有的在线用户,客户端接收此列表后,将在线用户的头像设置为在线状态,因为此操作同样为跨线程操作,所以使用委托,代码如下: private delegate void SetUsersListDelOnline(string token);/展示在线用户

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号