聊天室网络程序编辑实训报告-文本传输.doc_第1页
聊天室网络程序编辑实训报告-文本传输.doc_第2页
聊天室网络程序编辑实训报告-文本传输.doc_第3页
聊天室网络程序编辑实训报告-文本传输.doc_第4页
聊天室网络程序编辑实训报告-文本传输.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

聊天室网络程序编辑实训报告题 目: 聊天系统设计院 (系):电子与信息工程系 专 业:数字媒体技术 学 号:学生姓名:岚度摄影指导教师:时 间:2013.1.72013.1.11 前言摘要:本文提出并设计了一个局域网聊天系统,并在WINDOWS平台上利用C#编程语言加以实现。本设计将文本聊天和文件传输等功能综合在一个客户端程序之内,使用C#语言进行网络编程,并进行了人性化的界面设计,使用起来简单方便,并且功能十分合理,又易于扩展以及个性化定制。关键词:C/S体系结构、文本聊天、文件传输1. 聊天系统的程序设计目标与意义1.1. 设计目标在当今信息时代,越来越多的聊天系统被应用,聊天网站是聊天软件的基本雏形,C#语言又是当今流行的网络编程语言,它具有面向对象,与平台无关,安全,多线程等特点。使用c#语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的的,嵌入式设备进行应用程序的开发。面向对象的开发是当今世界最流行的开发方法,它不仅具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力。1.2. 设计的意义此次设计的题目为聊天室,可以巩固所学的C#语言基础知识,增进C#语言的编辑基本功,拓宽常用类库的应用,使我们通过教学环节与手段,把所学的课程及相关知识加以融会贯通,全面掌握C#语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。2. 聊天系统要实现的基本功能本文提出并设计了一个局域网聊天系统,并在WINDOWS平台上利用Visual Studio2010加以实现。本设计将文本聊天和文件传输等功能综合在一个客户端程序之内,使用C#语言进行网络编程,并进行了人性化的界面设计,使用起来简单方便,并且功能十分合理,又易于扩展以及个性化定制。聊天系统实现的基本功能1. 注册账户2. 登陆3. 个人信息管理4. 聊天处理5. 查找增加好友管理6. 聊天记录管理3. 聊天系统的系统概要1.首先可以打开登陆界面,并且有可以用于交互的界面,可以用于登陆,注册;登陆进去之后,可以修改用户的基本信息;登陆进去的用户,可以任意的向同一网络内的其他用户发送信息!登陆进去的用户可以查询自己的聊天记录,并且定期删除自己的聊天记录。2.没有登录的用户可以新的注册,密码错误的用户可以进行邮箱的验证,忘记密码的用户可以修改自己的密码3.可以修改自己的密保问题,并且可以自己定义密保问题4.可以修改发送的字体颜色,并且在信息栏目可以显示自己的用户信息4. 系统模块详细设计4.1. 文本聊天模块实现 凡是聊天系统,都少不了文本聊天功能,这是个基础功能。通过文本聊天,局域网内用户能够发送和接收文字信息,并在程序窗体上显示出来,相互之间进行在线交流,并能根据用户需要,对聊天记录进行简单的保存。文本聊天的信息传输协议主要有面向连接的TCP和无连接的UDP。TCP协议是互联网中最重的协议之一,主要特点是:保证数据包的准确到达;保证各数据包到达的顺序和数据包发出的顺序相同。UDP协议提供了快速但不一定可靠的传输服务,UDP协议采用无连接的套接字,不需要在网络设备之间发送连接信息,和TCP相比,UDP缺乏双方的握手信号,因此不保证数据包一定到达目的地,可靠性不如TCP,而且,由于UDP没有任何对双方会话的支持,不能保证各数据包到达的顺序与数据包发出的顺序相同。所以,在文本聊天模块中,采用TCP协议来传输文本信息。 客户端用来向服务器端发起一个连接,等待服务器的允许接入确认。若服务器端同意连接请求,接收到服务器的同意连接信号后,开启接收信息线程,并置消息发送事件为Enable,通信双方就可以进行文本聊天了。若服务器端拒绝连接,则释放Socket连接并关闭网络流。若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的发起。文本聊天程序流程图如图所示。 4.2. 信息的发送常用的协议有TCP协议、UDP协议 TCP:TransmissionControlProtocol传输控制协议,其是一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。UDP:UserDatagramProtocol用户数据报协议(RFC768),UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。系统也要定义自己的通讯协议,来完成一些系统的功能,如用户上,下线的通知,都要定义自己的通讯协议来完成相应的功能!也可以称这种自定义的协议为“命令”.下面以著名的飞鸽传书为例,说明其自定义的协议(命令)IPMSG_NOOPERATION不进行任何操作IPMSG_BR_ENTRY用户上线IPMSG_BR_EXIT用户退出IPMSG_ANSENTRY通报在线IPMSG_SENDMSG发送消息IPMSG_RECVMSG通报收到消息IPMSG_GETFILEDATA请求通过TCP传输文件IPMSG_RELEASEFILES停止接收文件IPMSG_GETDIRFILES请求传输文件夹以“IPMSG_BR_ENTRY用户上线”和“IPMSG_ANSENTRY通报在线”为例说明命令处理流程:当程序启动时,命令IPMSG_BR_ENTRY被广播到网络中,向所有在线的用户提示一个新用户的到达(即表示“我来了”);所有在线用户将把该新上线用户添加到自己的用户列表中,并向该新上线用户发送IPMSG_ANSENTRY命令(即表示“我在线”);该新上线用户接收到IPMSG_ANSENTRY命令后即将在线用户添加到自己的用户列表中。4.3. 文本聊天模块代码实现 第一部分.什么是广播地址,以及广播地址怎么计算主机号全为1,用于向一个网络内的所有主机发送信息的IP地址.如:受限的广播地址是55。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。第二部分.C#利用UDP协议如何实现广播button1_Click时使用了UDP广播向外发送了数据RecData()在后台接受UDP协议的消息namespace BroadcastExamplepublic partial class Form1:Formdelegate void AppendStringCallback(stringtext);AppendStringCallback appendstringcallback;private int port=51008;private UdpClient udpclient;public Form1()InitializeComponent();appendstringcallback = new AppendStringCallback(AppendString);private void AppendString(stringtext)if(richtextBox2.InvokeRequired=true)this.Invoke(appendstringcallback,text);elserichtextBox2.AppendText(text+rn);private void RecData()udpclient=new UdpClient(port);IPEndPoint remote=null;while(true)trybytebytes=udpclient.Receive(refremote);stringstr=Encoding.UTF8.GetString(bytes,0,bytes.Length);AppendString(string.Format(来自0:1,remote,str);catchbreak;privatevoidForm1_Load(objectsender,EventArgse)Thread mythread=new Thread(new ThreadStart(RecData);mythread.IsBackground=true;mythread.Start();private void Form1_FormClosing(objectsender,FormClosingEventArgse)udpclient.Close();private void button1_Click(objectsender,EventArgse)UdpClient myUdpclient=newUdpClient();tryIPEndPoint iep=new IPEndPoint(IPAddress.Broadcast,port);bytebytes=System.Text.Encoding.UTF8.GetBytes(textBox1.Text);myUdpclient.Send(bytes,bytes.Length,iep);textBox1.Clear();myUdpclient.Close();textBox1.Focus();catch(Exceptionerr)MessageBox.Show(err.Message,发送失败);finallymyUdpclient.Close();第三部分。启动主程序时,同时启动UDP的监听启动主程序时,同时启动UDP的监听,这时应该使用集合来做为消息队列的缓存,以便用户能在任何时候浏览到消息.这个集合一般在主程序中定义,而用户接受消息,一般我们会弹出窗口给用户来浏览消息,以及在新窗口中回复消息,那如何将主窗口中的消息,传递到消息显示窗体中呢?如何是Web(ASP.net)我们可以封装到form中传值,或者request传值,甚至可以在URL中接参数直接传值,而winform中窗体传值以上方法就都不在能用了.在windowsform之间传值,我总结了有四个方法:全局变量、属性、窗体构造函数和delegate。第一个全局变量:这个最简单,只要把变量描述成static就可以了,在form2中直接引用form1的变量,代码如下:在form1中定义一个static变量publicstaticinti=9;Form2中的钮扣按钮如下:privatevoidbutton1_Click(objectsender,System.EventArgse)textBox1.Text=Form1.i.ToString();使其成为主窗体FMMain的一个属性,接着修改显示子窗体的代码为以下两种的其中一种。方法一:FMChildfmChild=newFMChild();fmChild.ShowDialog(this);fmChild.Dispose();方法二:FMChildfmChild=newFMChild();FMChild.Owner=this;fmChild.ShowDialog();fmChild.Dispose();然后在修改子窗体FMChild中申明一个主窗体FMMain对象,FMMainfmMain;在需要使用主窗体FMMain的stringstrValueA的地方加上如下代码:fmMain=(FMMain)this.Owner;这样,就可以获得主窗体FMMain中strValueA的值了。这时,如果你需要将子窗体FMChild中的stringstrValueB传给主窗体FMMain,同样处理stringstrValueB.privatestringstrValueB;publicstringStrValueBgetreturnstrValueB;setstrValueB=value;那么你在关闭子窗体代码fmChild.Dispose();后,可以写一些代码来保存或者处理FMChild的strValueB,例如:stringstrTmp=fmChild.StrValueB;现在很多程序都有托盘功能,而我们的聊天系统更是如此,无论是QQ,旺旺,飞鸽传书等等,都是以托盘的形式工作在后台,对消息进行监听的.而VS2005给我们提供了现成的控件,来完成托盘的功能,下面我结合代码讲解下项目中可能用到的托盘技巧.1.如何实现托盘功能:在VS2005中直接添加notifyIcon控件,然后设置下icon属性,给其设置个图标即可,使用托盘功能.但是托盘并不能实现我们要求的功能,具体的功能实现,需要我们手工添加代码实现.2.如何最小化时自动到托盘private void Form1_Resize(objectsender,System.EventArgse)if(this.WindowState=FormWindowState.Minimized)this.Visible=false;this.notifyIcon1.Visible=true;3.如何双击托盘恢复原状private void notifyIcon1_Click(objectsender,System.EventArgse)this.Visible=true;this.WindowState=FormWindowState.Normal;this.notifyIcon1.Visible=false;4.实现托盘的闪烁功能(如QQ有消息时的闪烁)(1).首先我们在空白窗体中拖入一个NotifyIcon控件和定时控件privateSystem.Windows.Forms.NotifyIconnotifyIcon1;privateSystem.Windows.Forms.Timertimer1;(2).其次,我们准备两张ico图片,用来显示在任务栏,其中一张可用透明的ico图片,分别叫做1.ico和2.ico;并且建立两个icon对象分别用来存放两个ico图片;privateIconico1=newIcon(1.ico);privateIconico2=newIcon(2.ICO);/透明的图标(3).在Form_load中初始化notifyicon:privatevoidForm1_Load(objectsender,System.EventArgse)this.notifyIcon1.Icon=ico1;/设置程序刚运行时显示在任务栏的图标this.timer1.Enable=true;/将定时控件设为启用,默认为false;(4).先设置一个全局变量i,用来控制图片索引,然后创建定时事件,双击定时控件就可以编辑inti=0;privatevoidtimer1_Tick(objectsender,System.EventArgse)if(i1)this.notifyIcon1.Icon=ico2;i+;return;elsethis.notifyIcon1.Icon=ico1;i=0;4.4 发送消息,接受消息的处理.4.4.1.UDP发送信息namespaceXChat.SendMespublic class MsgSendprivate UdpClient udp=null;private int PORT;private IPEndPoint endP=null;public MsgSend()this.PORT=58888;publicMsgSend(intport)this.PORT=port;publicvoidSendMessage(stringhostName,stringmessage)this.udp=newUdpClient();endP=newIPEndPoint(Dns.GetHostEntry(hostName).AddressList0,PORT);trybyteb=Encoding.UTF8.GetBytes(message);udp.Send(b,b.Length,endP);catchSystem.Windows.Forms.MessageBox.Show(发送出错!);finallythis.udp.Close();要使用时直接new MsgSend().SendMessage(主机名,消息);4.4.2.UDP接收消息namespaceXChat.SendMes/设置消息到前台的委托public delegate voidSet Message(stringmes);public class MsgReciveprivate int PORT;private UdpClient udp=null;private Thread recThread=null;private IPEndPoint ipep=null;private SetMessages etMes;public MsgRecive()this.PORT=58888;publicMsgRecive(intport)this.PORT=port;publicvoidStartReciveMsg(SetMessagesetMes)this.setMes=setMes;udp=newUdpClient(PORT);recThread=newThread(newThreadStart(ReciveMsg);recThread.Start();publicvoidCloseReciveMsg()recThread.Abort();/recThread.Join();udp.Close();privatevoidReciveMsg()while(true)Thread.Sleep(500);byte b = udp.Receive(refi

温馨提示

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

评论

0/150

提交评论