版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络(春季学期)序号:序号:实验报告系别:计算机科学与技术班级:计算机12-1姓名:刘杰学号:总成绩:评语:日期:《计算机网络》实验报告实验名称熟悉常见网络产品实验序号1实验日期.5.21实验人刘杰一、实验目的、规定与环境一、实验目的该实验通过访问Internet搜索有关介绍网卡、集线器、交换机、路由器、多个传输媒体的类型、功效、特点和价格等,理解计算机网络的基本构造,掌握各网络部件在计算机网络中的作用。二、实验环境已安装好的WINProfessical(Server、NT)操作系统,并可访问因特网。二、实验环节在IE地址栏中输入www.谷歌.com或www.百度.com等搜索引擎网址;上网查询网络适配器的类型、功效、特点和价格;上网查询集线器(Hub)的类型、功效、特点和价格;上网查询交换机(Switch)的类型、功效、特点和价格;上网查询路由器(Router)的类型、功效、特点和价格;上网查询多个传输媒体的类型、功效、特点和价格;分析各网络部件在计算机网络中的作用。三、实验成果1、网络适配器网卡是工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接受、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功效等。类型:1、按照网卡支持的计算机种类分类,重要分为原则以太网卡和PCMCIA网卡:原则以太网卡用于台式计算机联网,而PCMCIA网卡用于笔记本电脑。2、按照网卡支持的传输速率分类,重要分为10Mbps网卡、100Mbps网卡、10/100Mbps自适应网卡和1000Mbps网卡四类:根据传输速率的规定,10Mbps和100Mbps网卡仅支持10Mbps和100Mbps的传输速率,在使用非屏蔽双绞线UTP作为传输介质时,普通10Mbps网卡与3类UTP配合使用,而100Mbps网卡与5类UTP相连接。10/100Mbps自适应网卡是由网卡自动检测网络的传输速率,确保网络中两种不同传输速率的兼容性。随着局域网传输速率的不停提高,1000Mbps网卡大多被应用于高速的服务器中。3、按网卡所支持的总线类型分类,重要能够分为ISA、EISA、PCI等功效:特点:一块网卡涉及OSI模型的两个层——物理层和数据链路层。物理层定义了数据传送与接受所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供原则接口。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供原则的数据接口等功效。价格:快速以太网普遍在100元以内千兆以太网普遍在几百元到几千元不等万兆以太网普遍在几千元到上万元不等集线器HUB是一种多端口的转发器,当以HUB为中心设备时,网络中某条线路产生了故障,并不影响其它线路的工作。因此HUB在局域网中得到了广泛的应用。大多数的时候它用在星型与树型网络拓扑构造中,以RJ45接口与各主机相连(也有BNC接口),HUB按照不同的说法有诸多个类。类型:HUB按照对输入信号的解决方式上,能够分为无源HUB、有源HUB、智能HUB和其它HUB。按构造和功效分类,集线器可分为未管理的集线器、堆叠式集线器和底盘集线器三类。功效:根据IEEE802.2合同,集线器功效是随机选出某一端口的设备,并让它独占全部带宽,与集线器的上联设备(交换机、路由器或服务器等)进行通信。特点:集线器(HUB)属于数据通信系统中的基础设备,含有流量监控功效。它和双绞线等传输介质同样,是一种不需任何软件支持或只需极少管理软件管理的硬件设备。Hub只是一种多端口的信号放大设备,工作中当一种端口接受到数据信号时,由于信号在从源端口到Hub的传输过程中已有了衰减,因此Hub便将该信号进行整形放大,使被衰减的信号再生(恢复)到发送时的状态,紧接着转发到其它全部处在工作状态的端口上。从Hub的工作方式能够看出,它在网络中只起到信号放大和重发作用,其目的是扩大网络的传输范畴,而不含有信号的定向传送能力,是—个原则的共享式设备。因此有人称集线器为“傻Hub”或“哑Hub”。另首先是Hub只与它的上联设备(如上层Hub、交换机或服务器)进行通信,同层的各端口之间不会直接进行通信,而是通过上联设备再将信息广播到全部端口上。价格:普遍在几十元到几百元不等,也有上千元的交换机类型:从广义上来看,网络交换机分为两种:广域网交换机和局域网交换机。广域网交换机重要应用于电信领域,提供通信用的基础平台。而局域网交换机则应用于局域网络,用于连接终端设备,如PC机及网络打印机等。从传输介质和传输速度上可分为以太网交换机、快速以太网交换机、千兆以太网交换机、FDDI交换机、ATM交换机和令牌环交换机等。从规模应用上又可分为公司级交换机、部门级交换机和工作组交换机等。各厂商划分的尺度并不是完全一致的,普通来讲,公司级交换机都是机架式,部门级交换机能够是机架式(插槽数较少),也能够是固定配备式,而工作组级交换机为固定配备式(功效较为简朴)。另首先,从应用的规模来看,作为骨干交换机时,支持500个信息点以上大型公司应用的交换机为公司级交换机,支持300个信息点下列中型公司的交换机为部门级交换机,而支持100个信息点以内的交换机为工作组级交换机。本文所介绍的交换机指的是局域网交换机。功效:交换机的重要功效涉及物理编址、网络拓扑构造、错误校验、帧序列以及流控。交换机还含有了某些新的功效,如对VLAN(虚拟局域网)的支持、对链路汇聚的支持,甚至有的还含有防火墙的功效。特点:二层交换和三层互通实现三层精确匹配查询专门针对局域网,特别是以太网进行了优化引入了某些在二层交换机和三层路由器上都不存在的特性实现了初步的BAS功效价格:普遍在几千元到上万元路由器(Router)类型:1、按性能档次分为高、中、低档路由器。2、从构造上分为模块化路由器和非模块化路由器3、从功效上划分,可将路由器分为骨干级路由器、公司级路由器和接入级路由器。4、按所处网络位置划分普通把路由器划分为边界路由器和中间节点路由器。5、从性能上可分线速路由以及非线速路由器功效:1、连通不同的网络从过滤网络流量的角度来看,路由器的作用与交换机和网桥非常相似路由器。但是与工作在网络物理层,从物理上划分网段的交换机不同,路由器使用专门的软件合同从逻辑上对整个网络进行划分。例如,一台支持IP合同的路由器能够把网络划分成多个子网段,只有指向特殊IP地址的网络流量才能够通过路由器。对于每一种接受到的数据包,路由器都会重新计算其校验值,并写入新的物理地址。因此,使用路由器转发和过滤数据的速度往往要比只查看数据包物理地址的交换机慢。但是,对于那些构造复杂的网络,使用路由器能够提高网络的整体效率。路由器的另外一种明显优势就是能够自动过滤网络广播。总体上说,在网络中添加路由器的整个安装过程要比即插即用的交换机复杂诸多。2、信息传输有的路由器仅支持单一合同,但大部分路由器能够支持多个合同的传输,即多合同路由器。由于每一种合同都有自己的规则,要在一种路由器中完毕多个合同的算法,势必会减少路由器的性能。路由器的重要工作就是为通过路由器的每个数据帧寻找一条最佳传输途径,并将该数据有效地传送到目的站点。由此可见,选择最佳途径的方略即路由算法是路由器的核心所在。为了完毕这项工作,在路由器中保存着多个传输途径的有关数据--途径表(RoutingTable),供路由选择时使用。途径表中保存着子网的标志信息、网上路由器的个数和下一种路由器的名字等内容。途径表能够是由系统管理员固定设立好的。静态路由表:由系统管理员事先设立好固定的途径表称之为静态(static)途径表。动态路由表:动态(Dynamic)途径表是路由器根据网络系统的运行状况而自动调节的途径表。路由器是一种多端口设备,它能够连接不同传输速率并运行于多个环境的局域网和广域网,也能够采用不同的合同。路由器属于OSI模型的第三层--网络层。指导从一种网段到另一种网段的数据传输,也能指导从一种网络向另一种网络的数据传输。第一,网络互连:路由器支持多个局域网和广域网接口,重要用于互连局域网和广域网,实现不同网络互相通信;第二,数据解决:提供涉及分组过滤、分组转发、优先级、复用、加密、压缩和防火墙等功效;第三,网络管理:路由器提供涉及路由器配备管理、性能管理、容错管理和流量控制等功效。所谓“路由”,是指把数据从一种地方传送到另一种地方的行为和动作,而路由器,正是执行这种行为动作的机器,它的英文名称为Router,是一种连接多个网络或网段的网络设备,它能将不同网络或网段之间的数据信息进行“翻译”,以使它们能够互相“读懂”对方的数据,从而构成一种更大的网络。为了完毕“路由”的工作,在路由器中保存着多个传输途径的有关数据--路由表(RoutingTable),供路由选择时使用。路由表中保存着子网的标志信息、网上路由器的个数和下一种路由器的名字等内容。路由表能够是由系统管理员固定设立好的,也能够由系统动态修改,能够由路由器自动调节,也能够由主机控制。在路由器中涉及到两个有关地址的名字概念,那就是:静态路由表和动态路由表。由系统管理员事先设立好固定的路由表称之为静态(static)路由表,普通是在系统安装时就根据网络的配备状况预先设定的,它不会随将来网络构造的变化而变化。动态(Dynamic)路由表是路由器根据网络系统的运行状况而自动调节的路由表。路由器根据路由选择合同(RoutingProtocol)提供的功效,自动学习和记忆网络运行状况,在需要时自动计算数据传输的最佳途径。特点:路由器是一种连接多个网络或网段的网络设备,它能将不同网络或网段之间的数据信息进行“翻译”,以使它们能够互相“读”懂对方的数据,从而构成一种更大的网络。路由器有两大典型功效,即数据通道功效和控制功效。数据通道功效涉及转发决定、背板转发以及输出链路调度等,普通由特定的硬件来完毕;控制功效普通用软件来实现,涉及与相邻路由器之间的信息交换、系统配备、系统管理等。多少年来,路由器的发展有起有伏。90年代中期,传统路由器成为制约因特网发展的瓶颈。ATM交换机取而代之,成为IP骨干网的核心,路由器变成了配角。进入90年代末期,Internet规模进一步扩大,流量每六个月翻一番,ATM网又成为瓶颈,路由器东山再起,Gbps路由交换机在1997年面世后,人们又开始以Gbps路由交换机取代ATM交换机,架构以路由器为核心的骨干网上网查询多个传输媒体的类型、功效、特点和价格价格:从几十元到几千元甚至上万5、传输媒体类型:它可分为两大类,即导向传输媒体和非导向传输媒体。在导向传输媒体中,电磁波被导向沿着固体媒体(铜线或光纤)传输,而非导向传输媒体就是指自由空间,在非导向传输媒体中电磁波的传输常称为无线传输。价格:几十-几百不等6、各网络部件在计算机网络中的作用网卡,网卡是工作在数据链路层的网路组件,是局域网中连接计算机和传输介质的接口,网卡是工作在数据链路层的网路组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接受、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功效等。HUB,也就是集线器。它的作用能够简朴的理解为将某些机器连接起来构成一种局域网。交换机(又名交换式集线器)作用与集线器大致相似。但是两者在性能上有区别:集线器采用的式共享带宽的工作方式,而交换机是独享带宽。这样在机器诸多或数据量很大时,两者将会有比较明显的。路由器与以上两者有明显区别,它的作用在于连接不同的网段并且找到网络中数据传输最适宜的途径,能够说普通状况下个人顾客需求不大。路由器是产生于交换机之后,就像交换机产生于集线器之后,因此路由器与交换机也有一定联系,并不是完全独立的两种设备。路由器重要克服了交换机不能路由转发数据包的局限性。《计算机网络》实验报告实验名称Windows环境下的服务器配备实验序号2实验日期.5.28实验人刘杰一、实验目的、规定与环境一、实验目的本实验是为了让学生学习DHCP(动态主机配备合同)、DNS(域名服务)、IIS、FTP服务的有关知识。二、实验环境1、运行WindowsServer的计算机并且已经安装了DHCP、DNS、IIS;2、一台Win客户机;3、服务器和客户机之间能够正常网络连接,并能够正常联入Internet。二、实验环节1、配备DHCP能够自动为其它计算机分派IP地址和子网掩码;2、配备DNS服务器(1)创立正向搜索区域:正向搜索区域是将域名转化为IP地址的区域文献;☆管理工具中打开DNS,点击根目录右键选择“新建区域”;☆在区域名中输入域名,如:;☆在区域文献中输入文献名,如:.dns;(2)配备正向搜索区域属性;☆右击所创立的正向搜索区域名,选择“属性”,按需要进行设立;(3)配备DNS正向搜索区域主机统计:主机统计通过一种区域内的IP地址与主机名发生联系;☆右击正向搜索区域名,选择“新建主机”;☆在对应的对话框输入主机名称(WWW、jxxx等)、IP地址,单击添加主机;(4)配备DNS正向搜索区域别名统计:别名统计是指向主机的官方域名的别名,这些统计能够允许使用不止一种名称指向同一种主机;☆右击正向搜索区域名,选择“新建别名”;(5)创立一种反向搜索区域并设立属性:反向搜索区域是指将IP地址转化为域名的区域文献;(6)使用DNS名字访问计算机。3、配备IIS服务器(1)配备WWW服务;(2)运用对应工具,建立个人的网站,将个人网站在Internet上公布;(3)配备FTP服务,同窗之间能够实现文献传送功效。三、实验成果四、实验总结Windows服务配备实验在实验当中,我学习了配备DHCP(动态主机配备合同)、DNS(域名服务)、IIS、FTP服务,通过这些服务的配备和管理操作,我对于Windows下的这几个服务器的配备有了更加进一步的理解,巩固了我的计算机网络知识。《计算机网络》实验报告实验名称基本Winsock编程实验序号3实验日期.6.4实验人刘杰一、实验目的、规定与环境一、实验目的1、理解Winsock编程原理;2、熟悉Windows网络编程接口;二、实验环境VisualStdio二、实验环节编写一种简朴的C/S通讯程序。具体规定:(1)使用WINSOCK通讯:WINSOCK是WindowsSocketsAPI的简称,已经成为Windows广泛应用的、开放的、支持多个合同、事实上的网络编程接口原则。(2)客户方程序与服务方程序位于两台不同的机器上,在客户方通过指定服务方的IP地址和端标语来通讯;(3)服务器程序,始终处在监听状态,含有持续接受客户发送的信息的能力(发送的信息任意)。三、实验代码1、服务器端代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Collections;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net;usingSystem.Net.Sockets;//引入Socket的命名空间usingSystem.Threading;//引入线程的命名空间namespaceChatApplicationServer{publicpartialclassfrmServerMain:Form{//clients数组保存目前在线顾客的client对象internalstaticHashtableclients=newHashtable();//该服务器默认的监听器privateTcpListenerlistener;//默认最大支持的客户端连接数staticintMAXUSER=100;//服务器与否启动的标志internalstaticboolServerFlag=false;publicfrmServerMain(){InitializeComponent();}publicdelegatevoidAppendMsgEventHandler(RichTextBoxrb,stringmsg);//定义在线程中操作不同线程创立的控件的委托publicdelegatevoidAppendUserEventHandler(ListBoxlb,stringusername);//启动服务器privatevoidbtStartServer_Click(objectsender,EventArgse){intiPort=this.returnValidPort(tbServerPort.Text.Trim());if(iPort<0){MessageBox.Show("错误的端口信息!","错误提示");return;}stringip=this.returnIpAddress();try{IPAddressuserIP=IPAddress.Parse(ip);//创立服务器套接字listener=newTcpListener(userIP,iPort);listener.Start();this.rbChatContent.AppendText("服务器已经启动,正在监听"+ip+"端标语:"+tbServerPort.Text+"..........\n");frmServerMain.ServerFlag=true;//下列办法启动一种新的线程,执行监听办法//方便在一种独立的进程中执行确认与客户端连接的操作Threadthread=newThread(StartListen);thread.Start();btStartServer.Enabled=false;btStopServer.Enabled=true;}catch(Exceptionex){this.rbChatContent.AppendText(ex.Message+"\n");}}//用于接受客户端的请求,确认与客户端的连接//并且启动一种新的线程解决客户端的请求privatevoidStartListen(){while(frmServerMain.ServerFlag){try{//当接受到客户端请求时,确认与客户端的连接if(listener.Pending()){SocketnewSocket=listener.AcceptSocket();if(clients.Count>=MAXUSER){MessageBox.Show("连接数已经超出允许连接的最大数"+MAXUSER.ToString()+",回绝新的连接!","错误提示");this.rbChatContent.AppendText("连接数已经超出允许连接的最大数"+MAXUSER.ToString()+",回绝新的连接!");newSocket.Close();}else{//启动一种新的线程,解决顾客对应的请求ChatClientnewClient=newChatClient(this,newSocket);ThreadClientThread=newThread(newClient.ClientService);ClientThread.Start();}}Thread.Sleep(200);}catch(Exceptionex){this.UpdateMsg(ex.Message);}}}//获取有效的端标语privateintreturnValidPort(stringstrPort){intport;//测试端标语与否有效try{if(tbServerPort.Text==""){thrownewArgumentException("端标语为空,不能启动服务器!");}else{port=Convert.ToInt32(tbServerPort.Text.Trim());}}catch(Exceptionex){this.rbChatContent.AppendText("无效的端标语:"+ex.Message+"\n");return-1;}returnport;}///<summary>///获取本机局域网IP地址///</summary>///<returns></returns>privatestringreturnIpAddress(){IPAddress[]AddressList=Dns.GetHostByName(Dns.GetHostName()).AddressList;if(AddressList.Length<1){return"";}returnAddressList[0].ToString();}///<summary>///获得拨号动态分派IP地址///</summary>///<returns></returns>privatestaticstringgetDynamicIPAddress(){IPAddress[]AddressList=Dns.GetHostByName(Dns.GetHostName()).AddressList;if(AddressList.Length<2){return"";}returnAddressList[1].ToString();}///更新显示信息publicvoidUpdateMsg(stringmsg){Invoke(newAppendMsgEventHandler(AppendMsgEvent),rbChatContent,msg+"\n");}///添加顾客更新界面publicvoidAddUser(stringname){stringstr="【"+name+"】"+"已经加入聊天!\n";Invoke(newAppendMsgEventHandler(AppendMsgEvent),rbChatContent,str);//AppendMsgEvent(rbChatContent,"【"+name+"】"+"已经加入聊天!\n");//将刚加入的顾客添加进顾客列表Invoke(newAppendUserEventHandler(AppendUserEvent),lbOnlineUser,name);this.tslOnlineUserNum.Text=Convert.ToString(clients.Count);}publicvoidAppendMsgEvent(RichTextBoxrb,stringmsg){rb.AppendText(msg);}publicvoidAppendUserEvent(ListBoxlb,stringusername){lb.Items.Add(username);}///获取顾客列表publicstringGetUserList() { stringuserList=""; for(inti=0;i<lbOnlineUser.Items.Count;i++) {userList=userList+lbOnlineUser.Items[i].ToString()+"|"; }returnuserList; }//移出顾客publicvoidRemoveUser(stringname){this.rbChatContent.AppendText(name+"已经离开聊天室\n");//将刚连接的顾客名加入到目前在线顾客列表中this.lbOnlineUser.Items.Remove(name);this.tslOnlineUserNum.Text=System.Convert.ToString(clients.Count);}//停止服务器privatevoidbtStopServer_Click(objectsender,EventArgse){frmServerMain.ServerFlag=false;btStartServer.Enabled=true;btStopServer.Enabled=false;UpdateMsg("服务器已经停止监听.\n");}//关闭窗体privatevoidfrmServerMain_FormClosing(objectsender,FormClosingEventArgse){frmServerMain.ServerFlag=false;}privatevoidtbServerPort_TextChanged(objectsender,EventArgse){this.btStartServer.Enabled=(this.tbServerPort.Text!="");}privatevoidfrmServerMain_Load(objectsender,EventArgse){}}publicclassChatClient{privatestringname;privateSocketcurrentSocket=null;privatestringipAddress;privatefrmServerMainserver;//保存目前连接的状态//CLOSED-->CONNECTED-->CLOSEDstringconnState="closed";publicChatClient(frmServerMainserver,SocketcurrentSocket){this.server=server;this.currentSocket=currentSocket;}publicstringName{get{returnname;}set{name=value;}}publicSocketCurrentSocket{get{returncurrentSocket;}set{currentSocket=value;}}publicstringIpAddress{get{returnipAddress;}}//获取远程IP地址privatestringgetRemoteIp(){return((IPEndPoint)currentSocket.RemoteEndPoint).Address.ToString();}//和客户端进行数据通信,涉及接受客户端的请求//根据不同的请求命令,执行对应的操作,并将操作成果返回给客户端publicvoidClientService(){string[]acceptStr=null;//保存消息字符byte[]buff=newbyte[1024];//缓冲区boolkeepConnected=true;//用循环不停地与客户端进行交互,直到其发出EXIT或者QUIT命令//将keepConnected设立为false,退出循环,关闭目前连接,中断目前线程while(keepConnected&&frmServerMain.ServerFlag){acceptStr=null;try{if(currentSocket==null||currentSocket.Available<1){Thread.Sleep(300);continue;}//接受信息存入buff数组中intlength=currentSocket.Receive(buff);//将字符数组转换为字符串stringCommand=Encoding.Default.GetString(buff,0,length);//对字符串按分隔符拆分acceptStr=Command.Split(newchar[]{'|'});if(acceptStr==null){Thread.Sleep(200);continue;}}catch(Exceptionex){server.UpdateMsg("程序发生异常,异常信息:"+ex.Message);}if(acceptStr[0]=="CONNECT"){//如果为CONECT,则它的命令格式为“CONNECT|发送者的顾客名:附件信息”//则acceptStr[1]保存的就是顾客名=acceptStr[1];if(frmServerMain.clients.Contains()){SendToClient(this,"ERORR|User"++"已经存在!");}else{HashtablesynClients=Hashtable.Synchronized(frmServerMain.clients);synClients.Add(,this);//更新界面server.AddUser();//对每一种在线顾客发送JOIN和LIST消息命令更新顾客列表IEnumeratormyIEnumerator=frmServerMain.clients.Values.GetEnumerator();while(myIEnumerator.MoveNext()){ChatClientcClient=(ChatClient)myIEnumerator.Current;SendToClient(cClient,"JOIN|"++"|");Thread.Sleep(100);}//更新连接状态connState="connected";SendToClient(this,"OK");//向客户端发送LIST命令更新顾客列表stringmsgUsers="LIST|"+server.GetUserList();SendToClient(this,msgUsers);}}elseif(acceptStr[0]=="LIST"){if(connState=="CONNECTED"){//向客户端发送LIST命令,以此更新客户端的目前在线顾客列表stringmsgUsers="LIST|"+server.GetUserList();SendToClient(this,msgUsers);}else{SendToClient(this,"ERROR|服务器未连接,请重新登录");}}elseif(acceptStr[0]=="CHAT"){if(connState=="connected"){//此时接受到的命令的格式为://命令标志符(CHAT)|发送者的顾客名:发送内容|//向全部目前在线的顾客转发此信息IEnumeratormyEnumerator=frmServerMain.clients.Values.GetEnumerator();while(myEnumerator.MoveNext()){ChatClientclient=(ChatClient)myEnumerator.Current;//将“发送者的顾客名:发送内容”转发给顾客SendToClient(client,acceptStr[1]);}server.UpdateMsg(acceptStr[1]);}else{//发送错误信息SendToClient(this,"ERR|服务器未连接,请重新登录");}}elseif(acceptStr[0]=="PRIV"){if(connState=="connected"){//此时接受到的命令格式为://命令标志符(PRIV)|发送者顾客名|接受者顾客名|发送内容|//acceptStr[1]中保存了发送者的顾客名stringsender=acceptStr[1];//acceptStr[2]中保存了接受者的顾客名stringreceiver=acceptStr[2];//acceptStr[3]中保存了发送的内容stringcontent=acceptStr[3];stringmessage=sender+"--->"+receiver+":"+content;//仅将信息转发给发送者和接受者if(frmServerMain.clients.Contains(sender)){SendToClient((ChatClient)frmServerMain.clients[sender],message);}if(frmServerMain.clients.Contains(receiver)){SendToClient((ChatClient)frmServerMain.clients[receiver],message);}server.UpdateMsg(message);}else{//发送错误信息SendToClient(this,"ERROR|服务器未连接,请重新登录");}}elseif(acceptStr[0]=="EXIT"){//此时接受到的命令的格式为:命令标志符(EXIT)|发送者的顾客名//向全部目前在线的顾客发送该顾客已离开的信息if(frmServerMain.clients.Contains(acceptStr[1])){ChatClientclient=(ChatClient)frmServerMain.clients[acceptStr[1]];//将该顾客对应的Client对象从clients中删除HashtablesyncClients=Hashtable.Synchronized(frmServerMain.clients);syncClients.Remove();server.RemoveUser();//向客户端发送QUIT命令stringmessage="QUIT|"+acceptStr[1];System.Collections.IEnumeratormyEnumerator=frmServerMain.clients.Values.GetEnumerator();while(myEnumerator.MoveNext()){ChatClientnewClient=(ChatClient)myEnumerator.Current;SendToClient(newClient,message);}server.UpdateMsg("QUIT");}//退出目前线程break;}Thread.Sleep(200);}}//回发消息给客户端privatevoidSendToClient(ChatClientclient,stringmsg){Byte[]message=System.Text.Encoding.Default.GetBytes(msg.ToCharArray());client.CurrentSocket.Send(message,message.Length,0);}}}2、客户端代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;//引入Sockets和线程的命名空间usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;namespaceChatApplication{publicpartialclassfrmClientMain:Form{//与服务器的连接privateTcpClienttcpClient;//与服务器交流的流通道privateNetworkStreamnsStream;//客户端的2种状态privatestaticstringCLOSED="closed";privatestaticstringCONNECTED="connected";privatestringclientState=CLOSED;privateboolStopFlag;publicfrmClientMain(){InitializeComponent();}//连接聊天室服务器privatevoidbtLogin_Click(objectsender,EventArgse){if(clientState==CONNECTED){return;}if(this.tbUserName.Text.Length==0){MessageBox.Show("请输入您的顾客名!","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);this.tbUserName.Focus();return;}try{//创立一种客户端套接字,它是Login的一种公共属性,//将被传递给frmClientMain窗体tcpClient=newTcpClient();//向指定的IP地址的服务器发出连接请求tcpClient.Connect(IPAddress.Parse(tbServer.Text),Int32.Parse(tbServerPort.Text));//获得与服务器数据交互的流通道(NetworkStream)nsStream=tcpClient.GetStream();//启动一种新的线程,执行办法this.ServerResponse(),//方便来响应从服务器发回的信息Threadnewthread=newThread(newThreadStart(this.ServerResponse));newthread.Start();//向服务器发送“CONNECT”请求命令,//此命令的格式与服务器端的定义的格式一致,//命令格式为:命令标志符(CONNECT)|发送者的顾客名|stringcmd="CONNECT|"+this.tbUserName.Text+"|";//将字符串转化为字符数组Byte[]bytes=System.Text.Encoding.Default.GetBytes(cmd.ToCharArray());nsStream.Write(bytes,0,bytes.Length);}catch(Exceptionex){MessageBox.Show(ex.Message);}}//用于接受从服务器发回的信息,//根据不同的命令,执行对应的操作privatevoidServerResponse(){ListBox.CheckForIllegalCrossThreadCalls=false;//定义一种byte数组,用于接受从服务器端发送来的数据,//每次所能接受的数据包的最大长度为1024个字节byte[]buff=newbyte[1024];stringmsg;intlen;try{if(!nsStream.CanRead){return;}StopFlag=false;while(!StopFlag){//从流中得到数据,并存入到buff字符数组中len=nsStream.Read(buff,0,buff.Length);if(len<1){Thread.Sleep(200);continue;}//将字符数组转化为字符串msg=System.Text.Encoding.Default.GetString(buff,0,len);msg.Trim();string[]acceptFromServer=msg.Split(newChar[]{'|'});//acceptFromServer[0]中保存了命令标志符(LIST或JOIN或QUIT)if(acceptFromServer[0].ToUpper()=="OK"){//解决响应Invoke(newaddHandler(add),rbChatContent,"命令执行成功");}elseif(acceptFromServer[0].ToUpper()=="ERROR"){//命令执行错误Invoke(newaddHandler(add),rbChatContent,"命令执行错误:"+acceptFromServer[1]);}elseif(acceptFromServer[0]=="LIST"){//此时从服务器返回的消息格式://命令标志符(LIST)|顾客名1|顾客名|2...(全部在线顾客名)|Invoke(newaddHandler(add),rbChatContent,"获得顾客列表");//add("获得顾客列表");//更新在线顾客列表lbUserList.Items.Clear();for(inti=1;i<acceptFromServer.Length-1;i++){lbUserList.Items.Add(acceptFromServer[i].Trim());}}elseif(acceptFromServer[0]=="JOIN"){//此时从服务器返回的消息格式://命令标志符(JOIN)|刚刚登入的顾客名|Invoke(newaddHandler(add),rbChatContent,acceptFromServer[1]+""+"已经进入了聊天室");this.lbUserList.Items.Add(acceptFromServer[1]);if(this.tbUserName.Text==acceptFromServer[1]){this.clientState=CONNECTED;}}elseif(acceptFromServer[0]=="QUIT"){if(this.lbUserList.Items.IndexOf(acceptFromServer[1])>-1){this.lbUserList.Items.Remove(acceptFromServer[1]);}Invoke(newaddHandler(add),rbChatContent,"顾客:"+acceptFromServer[1]+"离开聊天室");}else{//如果从服务器返回的其它消息格式,//则在ListBox控件中直接显示Invoke(newaddHandler(add),rbChatContent,msg);}}//关闭连接tcpClient.Close();}catch{}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44659.3-2024新能源场站及接入系统短路电流计算第3部分:储能电站
- 下雪留言句子
- 如何像英国人一样说英语
- 《继电保护原则》课件
- 生物:《多聚酶链式反应扩增DNA片段》课件新人教版选修
- 《水泵安装技术》课件
- 艺术非遗主题地产暖场活动活动策划方案
- 小红书游戏行业KFS投放方案
- 【语文】《荷塘月色》同步练习+2024-2025学年统编版高中语文必修上册
- 2024年新高一物理初升高衔接《力学单位制》含答案解析
- 四年级上册《海西》教案
- 亮化照明维护服务方案
- 大象版2022-2023三年级科学上册3.2《溶解与搅拌》课件
- 《人体解剖学》课程思政教学设计案例(一等奖)
- DB44∕T 858-2011 空调器高处作业安全规范
- 实验室十大危险操作和安全隐患
- 妇幼保健院关于修订岗位轮转制度
- 气候影响着人类活动人类活动对气候的影响
- 顶管及盾构施工技术及特点(62页)
- 生产部管理人员考试题(新进转正)范本
- 高中研究性学习如何选择、确立研究性学习课题PPT通用PPT课件
评论
0/150
提交评论