毕业设计(论文)-局域网即时通信软件的设计与实现.docx_第1页
毕业设计(论文)-局域网即时通信软件的设计与实现.docx_第2页
毕业设计(论文)-局域网即时通信软件的设计与实现.docx_第3页
毕业设计(论文)-局域网即时通信软件的设计与实现.docx_第4页
毕业设计(论文)-局域网即时通信软件的设计与实现.docx_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

盐城师范学院毕业设计局域网即时通信软件的设计与实现摘 要本软件是在局域网下实现的一款聊天软件,主要是为了解决中小型企业员工之间的通信问题。本软件是在不连接Internet的情况下进行内部交流的,这是与基于Internet的聊天软件最大的不同点。本软件以VisualStudio2010作为开发平台,采用C/S架构作为系统的总体结构,使用C#语言和局域网技术进行开发,后台数据库以SQL Server 2008数据库作为开发工具。客户端主要实现的功能有:用户注册功能,用户登录功能,消息接收功能,消息发送功能;服务器端主要实现的功能有:记录注册用户信息的功能,以及监听客户端发送消息的功能。使用者可以在不移动位置的情况下实现企业内部的在线聊天,大大提高了员工的工作效率。【关键词】监听;即时通信;C#;UDP协议全套设计加扣 3012250582ThedesignofInstantMessagingoftheLANinstantcommunicationsoftwareAbstractThe software is a chat software,which is InstantMessaging in LAN, mainly to solve the medium and small-sized enterprises employees communication problem . Compared with the chat software based on the Internet, the biggest difference of this software is that it can conduct internal communication in the case of not connecting to the Internet .The software ,with visual studio 2010 as a development platform ,uses C/S architecture as the overall structure of the system and uses C# language and LAN technology to develop.Its back-end database uses SQL Server 2008 database as a development tool.Ontheclientside,The main realization of functions are those, such as user registration function, user login function, message receiving function, message sending function; Ontheserverside,The main realization of functions are those, such as the function of the record registration user information, and the function of monitoring the client to send messages. Through the way,where users can implement the enterprise internal online chat under the premise of not moving, will greatly improve the efficiency of staff work .KeywordsListener, InstantMessaging,C#,UDPprotocol目 录1 引言11.1 选题的背景11.2 选题的意义11.3 选题的研究内容及目标12 需求分析12.1 软件需求12.2 硬件需求23 详细设计24 数据库设计35 软件实现45.1 类库QQClass55.1.1 UDPSocket控件65.1.2 MessageClass类75.1.3 ClassPublic类85.2 用户管理模块95.2.1 注册功能95.2.2 登录功能125.3 信息传递模块155.3.1 用户在线状态显示功能155.3.2 信息接收175.3.3 信息发送195.4 服务器端的控制台模块225.4.1 记录注册信息功能235.4.2 消息监听功能236 结论24参考文献26致 谢27盐城师范学院毕业设计1 引言1.1 选题的背景伴随着互联网科技的发展,计算机网络已成为人们日常生活中必不可少的存在。视屏软件、社交软件、聊天软件等,这些都给人们的生活带来了极大的改变。其中,聊天软件(例如QQ、微信)已完全渗透到人们的工作和生活当中。然而,作为公司员工,常常会用我们私人的聊天软件去完成工作中的信息、文件的收发,这使得好多公司内部的信息保留在私人空间中,给公司带来了不必要的损失。为了解决这种问题,就要开发属于公司自己的内部交流软件局域网即时通信软件。1.2 选题的意义选题的意义主要有以下几点:a)局域网即时通信可以在不连接Internet的情况下使用,所以不用担心网速带来的影响;b)解决了公司信息的保密性问题,不用担心公司重要信息会通过网络外泄,给公司带来了很大的经济利益;c)极大的方便了员工之间的沟通,提高了工作效率;1.3 选题的研究内容及目标在局域网内部,软件能实现注册、登录、在线聊天等功能。作为工作软件,一定要简洁大方,不做多余花哨设计,注重软件的实用性。与此同时,更重要的是要保证软件使用的稳定性,不能在使用过程中出现问题1。2 需求分析2.1 软件需求根据软件的特点,可以将其分为两大部分:服务器端和客户端。客户端主要由用户管理模块和信息传递模块组成。用户管理模块的功能主要是用户注册和用户登录。用户注册功能是当用户第一次在电脑上使用本软件时,首先需要进行注册,填写服务器端的IP地址以及端口号,同时保存用户的用户名和密码;注册成功之后,正确输入用户名和密码,便可进入信息传递模块。信息传递模块用于显示已注册用户的用户名和在线状态,同时用于客户端与远程客户端的消息发送和接收。服务器端用于监听本地客户端与远程客户端信息传递,并记录注册成功用户的信息2。功能模块结构具体如图2-1所示。图2-1 局域网即时通信软件功能模块示意图2.2 硬件需求根据Visual Studio发展情况来看,从最初的低版本到现在的高版本,都是向下兼容的,所以本软件选择使用率较高、兼容性较强的Visual Studio2010版本作为开发平台。软件的开发语言为C#,同时采用Microsoft SQL Server 2008作为数据库的管理软件, 运行环境为Microsoft .NET Framework。3 详细设计用户在电脑上使用本软件时,首先判断是否是第一次使用,如果是第一次使用,首先需要注册,用户需填写服务器IP地址、端口号、用户名以及正确输入两次密码,匹配成功之后将注册信息发送给服务器端,服务器端进行记录。如果用户已经注册过,则直接进行登录,登录时需输入注册成功的用户名和密码,验证成功则可进入软件进行聊天,验证失败则需重新填写用户名和密码,直至匹配成功。验证成功之后,一方面进入软件的信息传递模块,一方面将登陆成功信息发送给服务器端。进入信息传递模块向远程客户端发送消息时,需要将服务器端作为消息发送的中转站,最后再将消息发送给远程客户端;接收远程客户端发送的消息时,则无需经过服务器端,直接在信息传递模块进行接收。在消息传递的过程中,本地客户端、服务器端以及远程客户端都需要使用UDP协议3。即时通讯软件的流程图如图3-1所示。图3-1 即时通讯软件的流程图4 数据库设计本软件的数据库创建在Microsoft SQL Server 2008中,数据库的名称为db_MyQQData,此数据库中只有一张数据表tb_CurreneyUser表, tb_CurreneyUser表是用户注册表,是用来记录用户注册的编号、服务器IP地址、端口号、用户名、密码以及用户在线的状态等注册信息4。tb_CurreneyUser表具体数据信息如表4-1所示。表4-1 tb_CurreneyUser表字段名描述数据类型大小是否为主键ID编号int4是IP服务器IPvarchar(20)20否Port端口号int4否SubscriberN用户名varchar(20)20否CipherCode密码varchar(20)20否Stamp在线状态int4否数据库E-R图如图4-1所示:图4-1数据库E-R图本软件在类库QQClass的DataClass类中连接数据库,源码如下:private string ConStr = DataSource=.SQLEXPRESS;AttachDBFilename=E:AppDatadb_MyQQData_Data.MDF;integrated Security=True;UserInstance=True;5 软件实现图5-1项目文件夹如图5-1所示,本软件包含MyQQClient和MyQQserver两个Windows应用程序,以及一个QQClass类库。MyQQClient主要用于用户注册、登录以及信息的发送与接收;MyQQserver主要用于实现客户端与远程客户端的通信,以及用户在线状态的监听;QQClass用于封装发送或接收信息的功能5。5.1 类库QQClass为了方便服务器端和客户端的使用,可以使用类库QQClass,用于存储客户端和服务器端需要使用的类。类库QQClass中的类如表5-1所示。表5-1 类库Class中的类类名作用UDPSocket控件用于封装UDP协议,以控件的形式设置协议中的IP地址和端口号。同时定义了一个事件,这个事件的作用是监听主机端口号,来获取客户端的消息。6FClass在列表中对获取的Form进行增加和删除,并且可以根据指定的索引号查找列表中的相应的窗体。MessageClass使用枚举的方法,指定消息命令MsgCommand、发送类型SendKind以及消息发送的状态SendState等,并对其序列化。DataClass用于实现服务器端对数据表进行添加、修改以及读取的操作,同时对这些操作进行封装。7SerClass先将客户端发送或接收的消息对象序列化或反序列化成二进制流,然后再进行发送或接收。UIClass用于记录目前在线客户的客户编号、IP地址、端口号、用户名和用户状态,序列化UIClass类。UClass用于将注册用户的全部注册信息存储到基础类的列表中。ClassPublic用于记录基本信息,并使用自定义方法获取服务器端的所有IP地址以及windows目录。下面将对Class类库中的主要类做进一步分析与设计。5.1.1 UDPSocket控件UDPSocket控件是一个自定义的控件,由UDP协议封装而成的。所谓UDP协议,是User Datagram Protocol的简称,是OSI(即开放式系统互联)参考模型中处于第四层的一种无连接的传输层协议,在IP协议的上一层。UDP协议可以在给定的主机上识别多个目的地址,并能独立进行数据包的发送和接收。UDP协议还支持网络视频会议在内的众多C/S模式的网络应用。因此,要想在局域网内部使用即时通信,就必须使用“无连接的传输层协议”8。UDPSocket控件是将IP地址和端口号设置成控件属性的形式。同时,自定义一个事件DataArrival,这个事件的功能是监听主机的端口号,用于获取当前接收的消息。首先,在自定义控件UDPSocket控件上添加属性以及事件9,具体代码如下所示:/ IPEndPoint类将网络端点表示为 IP 地址和端口号,定义一个服务器端点,值为nullprivate IPEndPoint SEP = null;/新建UDP服务,其中UdpClient为类,它的功能是提供用户数据报协议 (UDP) 网络服务private UdpClient UDPSaas = new UdpClient(); /创建线程private System.Threading.Thread udpthread; /定义委托DAEH()public delegate void DAEH();/定义DAEH()委托的DataArrival事件public event DAEH DataArrival; /将localHost属性显示在属性窗口中,将Browsable设置为“可浏览”状态Browsable(true),Category(Local), Description(本地IP地址) public string LocalHost监听主机端口号,具体代码如下所示:protected void Listener ()/ IPEndPoint为类,功能是将网络端点表示为 IP 地址和端口号,此处是将IP地址和端口号以网络端点存储SEP = new IPEndPoint(IPAddress.Any,localPort); /如果UDPSaas不为空if (UDPSaas != null)UDPSaas.Close(); /新实例初始化UdpClient类,并将其绑定到提供的本地端口号UDPSaas = new UdpClient(localPort); try /创建线程udpthread = new Thread(new ThreadStart(GetUDPData);/开始执行udpthread.Start(); 获取当前接收的消息,具体代码如下所示:private void GetUDPData()/获取当前接收的消息while (active)trybyte Data = UDPSaas.Receive(ref SEP); /将获取的远程消息转换成二进制流 / 如果当前正在托管if (DataArrival != null)/利用当前控件的DataArrival事件将消息发给远程计算机DataArrival(Data, SEP.Address, SEP.Port); Thread.Sleep(0); catch 5.1.2 MessageClass类使用枚举的方法,指定消息命令MsgCommand、发送类型SendKind以及消息发送的状态SendState等,并对其序列化MessageClass类使用的主要变量如表5-2所示。表5-2 MessageClass类使用的主要变量变量名访问权限变量作用SIDpublic发送方编号SIPpublic发送方的IPSPortpublic发送方的端口号RIDpublic接收方的编号RIPpublic接收方的IPRPortpublic接收方的端口号sendKindpublic发送消息的类型(默认无类型)msgCommandpublic消息命令(默认无命令)sendStatepublic消息发送的状态MessageIDpublic消息IDDatapublic数据SubscriberNpublic用户名CipherCodepublic密码5.1.3 ClassPublic类ClassPublic类用于记录基本信息,并通过自定义方法获取服务器端的所有IP地址以及windows目录。遍历服务器端IP地址,具体代码如下:public string MyHostIP() /Dns是一个静态类,它从Internet域名系统检索关于特定主机的信息,GetHostName()是Dns类的一个方法,获得本机电脑的主机名string HN = Dns.GetHostName();/显示IP地址IPHostEntry HT = Dns.GetHostEntry(HN); / IPHostEntry类用于获取主机地址信息/循环到下一个IP 地址while (it.MoveNext() /获得IP地址IPAddress ip = (IPAddress)it.Current;return ip.ToString();获取Windows目录,代码如下:public string Get_windows() / Stringbuilder类是直接用于字符串操作的类, 表示可变字符字符串StringBuilder BA = new StringBuilder(nChars);/ GetWindowsDirectory是一个函数,用以获取Windows目录的完整路径名。GetWindowsDirectory(BA, nChars);/返回目录信息return BA.ToString();5.2 用户管理模块用户管理模块包括用户注册功能与用户登录功能。5.2.1 注册功能用户注册功能是当用户首次使用此软件的时候,需要进行用户注册,注册成功后,将注册成功的用户信息发送给服务器端,将其保存到数据库db_MyQQData中。用户注册界面如图5-2所示。图5-2 用户注册界面信息填写完成后,如果text_PW与text_PW2输入的密码相同,点击左下角的“确定”按钮时,将执行类库QQClass中自定义控件UDPSocket1的方法,将注册信息发送给服务器端。服务器端的DataArrival()事件对客户端发送的消息进行监听,当监测到有用户注册时,调用RegisterUser()方法,在RegisterUser()方法中又调用了InsertUser()方法和UpdateUserList()方法,其中InsertUser()方法用于插入注册用户信息,并将其存入数据库中,最后使用UpdateUserList()方法将刚刚注册成功的用户信息发送给所有在线用户10。点击“确定”按钮,执行如下代码: /如果text_PW与text_PW2一致if (text_PW.Text.Trim() = text_PW2.Text.Trim() /创建并引用类库中的RegisterMsg() RegisterMsg RegMessage = new RegisterMsg();/ text_N为控件,记录用户名 RegMessage.SubscriberN = text_N.Text; /将RegMessage序列化为二进制流 byte RegD = new SerClass().SerializeBinary(RegMessage).ToArray(); /引用MessageClass()类 MessageClass Message = new MessageClass();/设置为发送命令 Message.sendKind = SendKind.SendCommand; /将消息命令设为用户注册 Message.msgCommand = MsgCommand.Registering; /text_IP为控件,存储主机的IP地址 serID = text_IP.Text.Trim(); /text_IP5为控件,存储端口号,将消息发送给服务器 udpSocket1. Send(IPAddress.Parse(serID), Convert.ToInt32(text_IP5.Text.Trim(), new SerClass().SerializeBinary(Message).ToArray(); /如果text_PW与text_PW2不一致 else / text_PW为控件,记录密码text_PW.Text = ;/ text_PW2为控件,记录确认密码 text_PW2.Text = ; /弹出输入错误提示信息 MessageBox.Show(密码输入不一致,请重新输入); 服务器端的DataArrival()事件监听到用户注册时,调用RegisterUser()方法,代码如下:case MsgCommand.Registering: /Ip为注册用户的IP地址RegisterUser(Message, Ip, Port); break;用户注册,代码如下:private void RegisterUser() /插入用户,其中Ip为注册用户的IP地址Message = InsertUser(Message,Ip,Port);/将注册信息成功用户信息发送给当前在线用户UpdateUserList(Message, Ip, Port);插入用户,代码如下所示:private MessageClass InsertUser()/创建并引用DataClass类DataClass OP = new DataClass();/注册用户的名称String SubscriberN = RegMessage.SubscriberN; /注册用户的密码String CipherCode = RegMessage.CipherCode;/注册用户的IP地址String vServer_sideIP = Ip.ToString();/向数据表tb_CurreneyUser中添加注册信息,其中ExSQL为DataClass类的方法,用于查询指定的数据表,返回行数OP.ExSQL(insert into tb_CurreneyUser (IP,Port, SubscriberN,CipherCode,Logo) values ( + Server_sideIP + , +Port.ToString() + , + SubscriberN + , + CipherCode + , + Convert.ToString(int)(MsgCommand.Registered) + );/用户注册结束命令Message.msgCommand =MsgCommand.Registered;/将注册成功命令返回给注册用户,其中Ip为注册用户的IP地址SendMsgToSingel(Ip,Port, Message);向当前在线用户发送注册成功用户的信息,代码如下所示:private void UpdateUserList ()/在数据表tb_CurreneyUser中查找信息,其中ExSQLReDr为DataClass类的方法,用于指定的数据表,返回SqlDataReader对象SqlDataReader FetchData = OP.ExSQLReDr(Select * From tb_CurreneyUser);while (FetchData.Read() /创建并引用UIClass类UIClass Array = new UIClass();/记录用户编号Array.UserID = Convert.ToString(FetchData.GetInt32(0);/查找当前已上线的用户FetchData = OP.ExSQLReDr(Select * From tb_CurreneyUser Where Logo = + MsgCommand.Logined);/向所有上线用户发送用户列表while (FetchData.Read()udpSocket1. Send(IPAddress.Parse(FetchData.GetString(1), FetchData.GetInt32(2), new SerClass().SerializeBinary(Message).ToArray();同时,在注册窗体中应用了INI文件,用于存放注册成功后的端口号、服务器IP地址和用户名称。在使用INI文件前,首先要使用API函数的WritePrivateProfileString()方法创建INI文件,存储section、key、val、filePath等信息。注册成功时在INI文件中保存服务器IP地址、端口号和用户名称等信息,具体代码如下所示:private void DataArrival() try switch (Message.msgCommand) /注册成功case MsgCommand.Registered: /关闭对话框 DialogResult = DialogResult.OK; /向huayonghui.ini文件中写入服务器IP地址 WritePrivateProfileString(Chat, ID, serID, PubClass.Get_windows() + huayonghui.ini); /向huayonghui.ini文件中写入端口号 /向huayonghui.ini文件中写入用户名 break; 5.2.2 登录功能用户注册完成后,注册信息保存在服务器端的数据库中。再次打开软件时,就需要进行用户登录,用户登录界面如图5-3所示。如果用户名和密码全部输入正确,将返回登陆成功信息,关闭登陆页面,进入信息传递界面。图5-3 用户登录界面登陆时,首先要在windows目录中查找INI文件,如果windows目录中不存在,则要进行用户信息注册;如果程序启动目录中存在,使用GetPrivateProfileString()方法读取INI文件中的服务器端的IP地址和端口号,启动类库Class中自定义控件UDPSocket1。输入用户名和密码后,点击“登录”按钮,执行button_Entry_Click()方法,将用户名称和密码发送给服务器端,服务器端的DataArrival()事件监听到用户登录,调用UserLogin()方法,在数据库中根据用户名和密码进行查询,信息匹配之后设置为上线状态,使用UpdateUser()方法更新用户列表10。查找INI文件,代码如下所示:private voidF_ Logon_Load() /如果存在huayonghui.iniif (System.IO.File.Exists(PubClass.Get_windows() + huayonghui.ini) = false) / SerSetup为注册Form,此处为调用注册功能SerSetup FSS = new SerSetup(); FSS.Text = 用户注册; /如果弹出注册界面对话框if (FSS.ShowDialog(this) = DialogResult.OK)FSS.Dispose();/释放注册界面的资源 else /关闭对话框DialogResult = DialogResult.Cancel; /如果存在huayonghui.ini文件if (System.IO.File.Exists(PC.Get_windows() + huayonghui.ini) = true) /读取服务器IP地址 GetPrivateProfileString(Chat, ID, 服务器地址读取错误, Transfer, 255, PubClass.Get_windows() + huayonghui.ini); ClassPublic.ServerIP = Transfer.ToString(); /以相同的方法读取端口号和用户名,只需将“ID”分别换成“Port”和“Name” 点击“登录”按钮,执行如下代码:private void button_ PubClass_Click() /验证服务器IP和端口号if (ClassPublic.ServerPort != & ClassPublic.ServerIP != ) /创建并引用类库中的RegisterMsg()RegisterMsg RegMessage = new RegisterMsg();/ Title_Text控件记录用户名 RegMessage.SubscriberN = Title_Text.Text; / CipherCode_Text控件记录密码 RegMessage.CipherCode = CipherCode_Text.Text; /将发送类型设置为发送命令 Message.sendKind = SendKind.SendCommand; /将二进制流存入到二进制变量Data中 Message.Data = RegD; /text_IP为控件名,存储主机的IP地址 serID = text_IP.Text.Trim(); /用户名ClassPublic.UserName = Title_Text.Text;服务器端的DataArrival()事件监听到用户登录,调用UserLogin(),代码如下:case MsgCommand.Logining: /Ip为注册用户的IP地址UserLogin(Message, Ip, Port, 1);break;调用UserLogin()方法,进行用户登录操作,代码如下所示:private void UserLogin()/在数据库中通过用户名和密码进行查找,其中ExSQLReDr为DataClass类的方法,用于指定的数据表,返回SqlDataReader对象SqlDataReader FetchData = OP.ExSQLReDr(Select * From tb_CurreneyUser Where Name = + +SubscriberN+ and CipherCode = +CipherCode+);/读取查找到的信息FetchData.Read();/获取第一条记录中的ID字段值string ID = Convert.ToString(FetchData.GetInt32(0);/如果FetchData中有记录信息if (FetchData.HasRows) /修改当前用户的状态为上线状态,其中ExSQL为DataClass类的方法,用于查询指定的数据表,返回行数OP.ExSQL(Update tb_CurreneyUser Set Logo = + Convert.ToString(int)(MsgCommand.Logined) + ,IP = + + Server_sideIP + ,Port = + + Port.ToString() + + Where ID = + ID);/用户结束登录,上线Message.msgCommand = MsgCommand.Logined;/Ip为注册用户的IP地址,将登录成功消息返回给用户SendMsgToSingel(Ip, Port,Message);/更新用户在线状态UpdateUserState(Message,Ip,Port);更新用户列表,代码如下:private void UpdateUser()/创建并引用DataClassDataClass OP = new DataClass();/查找所有注册的用户信息,其中ExSQLReDr为DataClass类的方法,用于指定的数据表,返回SqlDataReader对象SqlDataReader FetchData = OP.ExSQLReDr(Select * From tb_CurreneyUser);LV_hua.Items.Clear();/LV_hua为ListView控件的控件名,清空ListView中的数组/遍历所有用户while (FetchData.Read() /新建数组ListViewItem Arr = new ListViewItem();/将第一条数据存放到文本中Arr.Text = Convert.ToString(FetchData.GetInt32(0); / 将第二条记录中的字段值添加到LV_hua中Arr.SubItems.Add(FetchData.GetString(1);/将第四条记录中的字段值添加到LV_hua中Arr.SubItems.Add(FetchData.GetString(3);/将这个数组添加到LV_hua中LV_hua.Items.Add(Arr);OP.Dispose();5.3 信息传递模块信息传递模块主要功能是显示注册用户的在线状态,以及信息接收和信息发送。5.3.1 用户在线状态显示功能用户状态显示功能界面如图5-4所示。图5-4 用户状态显示功能界面首先,使用GetUserList()方法,在for()循环中遍历所有用户,获取服务器端已注册的所有用户名称。如果用户此刻为上线状态,设置上线用户的图片,否则,设置离线用户的图片,在TreeView控件中显示用户名和用户状态,根据用户状态判断用户此刻是否在线。代码如下:private void GetUserList()MessageClass Message = (MessageClass)new SerClass().DeSerializeBinary(new MemoryStream(Data);/获取所有用户信息 Subscriber = (UClass)new SerClass().DeSerializeBinary(new MemoryStream(Message.Data);/清空所有节点TV_hua.Nodes.Clear(); /遍历所有用户 for (int i = 0; i Subscriber.Count; i+) /创建数组UIClass Arr = Subscriber i;TreeNode Node = new TreeNode();/获取当前节点的名称 Node.Text = Arr.SubscriberN; /如果当前用户为上线状态 if (Arr.State = Convert.ToString(int)MsgCommand.Logined) /设置上线用户的图片Node.ImageIndex = 1;Node.SelectedImageIndex = 1; else /设置下线用户的图片Node.ImageIndex = 0; Node.SelectedImageIndex = 0; TV_hua.Nodes.Add(Node); 5.3.2 信息接收当远程客户端向本地客户端发送消息时,首先要使用类库中的UDPSocket1控件的DataArrival事件对消息进行监听,监听到远程客户端发送的消息时,调用ReceiveMsg()方法,以此接收信息,根据远程客户端发送的消息容量的不同,使用不同的方法进行接收,同时将接收的信息添加到F_Chat的richTextBoxt控件中。监听远程客户端发送的消息,代码如下所示:private void DataArrival()try MessageClass Message = new SerClass().DeSerializeBinary(new System.IO.MemoryStream(Data) as MessageClass;switch (Message.msgCommand) /获取远程客户端发送的消息case MsgCommand.SendToSingle:GetMsg(Data, Ip, Port);break;catch 接收远程客户端发送的信息,代码如下:private void GetMsg()MessageClass Message = (MessageClass)new SerClass().DeSerializeBinary(new MemoryStream(Data); /发送方用户IDstring SenderID = Message.SID;/ sendKind为消息接收类型switch (Message.sendKind) /接收类型为消息case SendKind.SendMsg: /消息接收的状态switch (Message.sendState) /容量小的单消息case SendState.Single: String rtf = Encoding.Unicode.GetString(Message.Data);/获取信息 Form MessageF = null; /定义一个窗体 /在TV_hua控件中遍历节点 for (int i = 0; i TV_hua.Nodes.Count; i+) /如果当前节点的Tag值为发送信息的用户IDif (TV_hua.Nodesi.Tag as UIClass).UserID = SenderID) if (MessageF != null) /将光标定位到RT_Output控件的起始位(MessageF as F_Chat).RT_Output.SelectionStart = 0;/将发送方的名称添加到RT_Output控件中 (MessageF as F_Chat).R

温馨提示

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

最新文档

评论

0/150

提交评论