总结组网是将许多设备(如计算机、工作站和打印机)连接成一个网络以共享资源统一资源标识符用于标识Internet上的资源以及通信协 议WebClient类从特定URI请求并接收文件WebRequest类与服务器连接、发送请求和接收响应端口是特定机器 上已编号的套接字。服务器进程侦听端口,直到有客户端与其连接为止TcpClient类有可用于连接、发送和接收流数据的方法;Tcp Listener类具有侦听进入的TCP连接的方法TCP/IP协议的基本传输单位是数据包(datagram),TCP协议 负责把数据分成若干个数据包,并给每个数据包加上包头(就像给一封信加上信封),包头上有相应的编号,以保证在数据接收端能将数据还原为原 来的格式,IP协议在每个包头上再加上接收端主机地址,这样数据找到自己要去的地方(就像信封上要写明地址一样),如果传输过程中出现数据 丢失、数据失真等情况,TCP协议会自动要求数据重新传输,并重新组包。总之,IP协议保证数据的传输,TCP协议保证数据传输的质量。 --------------基于C#语言Windows程序设计第七章、WinForms网络编程本章主要内容介绍7. 1windows和窗体7.2VisualStutio.netIDE简介7.3事件处理CONTE NT本章学习目标:了解组网通过WinForms访问Internet通过WinForms进行套接字编程组网简介3 -1打印机在物理上连接至单台计算机连接在网络上的多位用户打印?打印?打印?组网是指将网络中的计算机连接在一起可共享打 印机以供网络中所有用户使用降低了为每个用户采购打印机而带来的成本,充分利用资源组网简介3-2组网是将许多设备(如计算机 、打印机和工作站)连接成一个网络以共享资源WinForms网络编程中用到System.Net和System.Net.Soc kets命名空间System.Net命名空间主要处理高层的操作,例如下载和上载文件System.Net.Sockets 包含执行低层操作的类,处理用于让计算机之间高效通信的代码组网简介3-3电源插座电度表具有唯一的地址网络套接字使 用数据包和IP地址IP地址唯一地标识Internet上的每台电脑IP(Internet协议)低层的路由协议可将数 据分成很小的数据包并通过网络将它们发送到某个地址。TCP(传输控制协议)可靠传输数据的高层协议UDP(用户数据报协议)支 持快速、无连接、不可靠的数据包传输访问Internet6-1Internet应用程序客户端应用程序服务器应用程序万 维网是一个客户端/服务器应用程序,借助浏览器对世界各地的Web服务器上存储的数据进行访问WebClient类请求文件并 从特定URL接收文件不能继承具有一些方法可用于从URI标识的任何本地Intranet或Internet资源发 送和接收数据。访问Internet6-2URI用于标识Internet上的资源以及通信协议路径标识符从服务器上查找 请求的信息服务器标识符可标识DNS主机名或TCP地址模式标识符标识用于通信的协议可选查询字符串将信息从客户端传递至服 务器http://msdn.microsoft.com/library/default.asp?url=/library/en- us/cpguide/html/cpconrequestingdata.asp访问Internet6-3发送或接收来自统一 资源标识符的数据向统一资源标识符发出请求得到统一资源标识符发出的响应访问Internet6-4属性Header sQueryString方法DownloadData()DownloadFile()OpenRead()OpenWri te()UploadFile()WebClient类的属性和方法创建如下所示的窗体2.将下列名称空间添加至窗体。u singSystem.Net;usingSystem.IO;3.在按钮btnGo的Click事件中添加下列代 码,以从文本框输入的URI中读取数据。privatevoidbtnGo_Click(objectsender,S ystem.EventArgse){ WebClientclient=newWebClient(); Stre amstrm=client.OpenRead(txtURI.Text); StreamReadersr=newSt reamReader(strm); stringline; while((line=sr.ReadLine())!= null) { lstRecd.Items.Add(line); } strm.Close();}访问Inte rnet6-5WebRequest类抽象类封装与服务器连接、发送请求和接收响应的详细信息使用传递至其Create() 方法的URI值创建特定于协议的实例对WebRequest实例调用的GetResponse()方法帮助向Inter net资源发出请求属性MethodRequestUri方法Create()GetRequestStream()Ge tResponse()访问Internet6-6WebResponse类抽象类提供来自URI的响应。客户端应用 程序不创建WebResponse对象,因为在对WebRequest实例调用GetResponse()方法时会创建它们。 privatevoidbtnGo_Click(objectsender,System.EventArgse){ WebRequestwrq=WebRequest.Create(txtURI.Text);WebResponse wrs=wrq.GetResponse();Streamstrm=wrs.GetResponseStream(); StreamReadersr=newStreamReader(strm);stringline; while((line=sr.ReadLine())!=null){ lstRecd.Items.Add(l ine);}strm.Close();}使用WebRequest和WebResponse类实现“执行 ”按钮的功能套接字编程System.Net.Sockets名称空间包含允许直接发送TCP网络请求或侦听特定端口上的TCP网络请 求的相关类大量的方法和属性用于网络连接提供客户端连接,用于创建和使用TCP网络服务可用于从TCP网络客户端侦听连接 可用于为UDP客户端创建连接(它是TCP的备用协议,在本地网络上使用)使用TCP类TCP(Transfers ControlProtocol,传输控制协议)类包含连接两个点并在这两个点之间发送数据的方法一个点由IP地址和端口 号组成。现有协议具有定义好的端口号HTTP使用端口号80;SMPT或电子邮件使用端口号25;FTP使用端口号21 InternetAssignedNumberAuthority(IANA,Internet编号分配管理机构)负责为这些有 名的服务分配端口号TCP提供有保证的传送、错误更正和数据缓冲TcpClient类具有通过网络连接、发送和接收流数据的简单方 法TcpListener类具有侦听进入的TCP连接的方法0TcpClient对象属性说明ReceiveBuff erSize获取或设置接收缓冲区的大小SendBufferSize获取或设置发送缓冲区的大小方法说明Close关 闭所有TCP连接并释放与TcpClient关联的资源Connect将使用主机名和端口号将客户端连接至远程TCP 主机GetStream返回用于发送和接收数据的NetworkStreamTCPListener类的方法方法说明A cceptSocket返回与远程客户端通信的套接字AcceptTcpClient接受暂挂的连接请求Start开始侦听进入 的连接请求Stop关闭侦听器TcpListener类具有侦听进入的TCP连接的方法,其中Start()方法用于开始侦听进入的 连接请求,并且将把进入的连接放置在队列中,直到调用Stop()为止。AcceptSocket()或AcceptTcpClient( )方法可用于从进入的连接请求队列中提取连接。TCP类应用程序实例8-1将以下两个名称空间添加至窗体usingS ystem.Net.Sockets;usingSystem.IO;在窗体的声明区域中声明下列变量 public TcpListenertcpListener; privateNetworkStreamnetworkStream; privateStreamReaderstreamReader; privateStreamWriterstream Writer; publicSocketsocketForClient;TCP类应用程序实例8-2private voidbtnstart_Click(objectsender,System.EventArgse){tcpL istener=newTcpListener(1234);tcpListener.Start();Me ssageBox.Show("服务器已启动");socketForClient=tcpListener.Accept Socket();networkStream=newNetworkStream(socketForClient) ;streamWriter=newStreamWriter(networkStream);streamRea der=newStreamReader(networkStream);try{if(socketFo rClient.Connected){ MessageBox.Show("客户端已连接"); stringline= streamReader.ReadLine(); txtServerClient.Text=line; line=line.T oUpper()+"!"; streamWriter.WriteLine(line); txtServerServer.Te xt=line; streamWriter.Flush();} }catch(Exceptionae){ Console.WriteLine(ae.ToString()); }}在按钮btnstart的Click事件中添加下列代码TCP类应用程序实例8-3privatevoi dbtnRecd_Click(objectsender,System.EventArgse){try{ if(socketForClient.Connected){ stringline=streamRead er.ReadLine(); txtServerClient.Text=line; line=line.ToUpper ()+"!"; streamWriter.WriteLine(line); txtServerServer.Text =line; streamWriter.Flush(); }} catch(Exceptionae){ Console.WriteLine(ae.ToString()); }}在按钮btnRecd的Click事件中添加下列代码,以连续将数据传输到客户端TCP类应用程序实例8- 4privatevoidForm1_Closing(objectsender, System.ComponentModel.CancelEventArgse){DialogResultanswer =MessageBox.Show(“这将关闭服务器。您是否确实要关闭它?","提示框",Mess ageBoxButtons.YesNo);if(answer==DialogResult.Yes){ Application.Exit();}if(answer==DialogResult.No){ e.Cancel=true;}socketForClient.Close();}在窗体Form1的Cl osing事件中添加下列代码,以关闭所有连接TCP类应用程序实例8-5将以下两个名称空间添加至窗体usingSyst em.Net.Sockets;usingSystem.IO;声明下列变量TcpClientmyclient;priv ateNetworkStreamnetworkStream;privateStreamReaderstreamRead er;privateStreamWriterstreamWriter;TCP类应用程序实例8-6在窗体的构造函数 中添加代码,以在特定端口建立与服务器的连接publicForm1(){InitializeComponent(); try{myclient=newTcpClient("localhost",1234);} catch{MessageBox.Show("未能在{0}:999处连接至服务器","l ocalhost");return;}networkStream=myclient.GetStream( );streamReader=newStreamReader(networkStream);streamWrit er=newStreamWriter(networkStream);}TCP类应用程序实例8-7在命令按钮btn Send的Click事件中编写下列代码privatevoidbtnSend_Click(objectsender, System.EventArgse){ txtServer.Text=""; if(txtClient.Tex t==""){ MessageBox.Show("请在文本框中输入内容"); txtClient.Focus(); return; } try{ strings; streamWriter.WriteLine(txtC lient.Text); streamWriter.Flush(); s=streamReader.ReadLine (); Console.WriteLine("正在读取消息"); txtServer.Text=s; } catch(Exceptionee) { MessageBo x.Show(“从服务器中读取时产生异常"+ee.ToString()); }}privatevoidFor m1_Closing(objectsender,System.Component Model.CancelEventArgse){ streamReader.Close(); streamWriter. Close(); networkStream.Close();}TCP类应用程序实例8-8在窗体Form1的C losing事件中添加下列代码以关闭资源UDP类当应用程序中速度和性能需求比可靠性更重要时,开发人员可以使用UDP( UserDatagramProtocol,用户数据报协议)与TcpClient相比,UdpClient类的接口更 小且更简单。UdpClient不包含返回网络流以进行读写的方法因为UDP是无连接协议,所以与远程主机的连接是在发送和接 收数据时进行的方法Close()Receive()Send()P2P技术简介P2P,即英文Peer-to-Peer的 缩写,译为对等互联或点对点技术。P2P是一种用于在不同PC用户之间,不经过中继设备直接交换数据或服务的技术,它允许Internet 用户直接使用对方的文件。网络中的任意用户都可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载 。因为消除了中间环节,P2P技术使得网络上的沟通变得更容易、更直接它建立在TcpListener以及TcpClient这两个类基 础上P2P应用程序示例5-11.创建一个名为“Example2”的Windows应用程序2.将文件名“For m1.cs”更改为“frmSendFile.cs”3.设计如图所示的窗体。将文本框分别命名为txtHostName和tx tPort,并且将按钮命名为btnSendFile发送应用程序应用程序示例演示了如何从一点向另一点发送文件此应用程序打开 与服务器的TCP连接,并向它发送此C#源代码P2P应用程序示例5-24.在项目中添加命名空间。usingSy stem.Net;usingSystem.Net.Sockets;usingSystem.IO;5.在btnSend File按钮的Click事件中添加代码。privatevoidbtnSendFile_Click(objectsen der,System.EventArgse){ //TcpClient对象可指定主机名和端口 TcpClientob jTcpClient=newTcpClient(txtHostName.Text, Int32.Parse(this.txtPort.Text)); //为TcpClient对象创建新的流 Netwo rkStreamobjNetworkStream=objTcpClient.GetStream(); //在打开模式下添加 文件 FileStreamobjFileStream=File.Open("..\\..\\frmSendFile.cs" ,FileMode.Open);//读取字节 intdata=objFileStream. ReadByte(); while(data!=-1) { //Writingbytestothestrea m objNetworkStream.WriteByte((byte)data); data=objFileStrea m.ReadByte(); } //关闭所有打开的流 objFileStream.Close(); objNetworkS tream.Close(); objTcpClient.Close();}代码使用主机名和端口号创建TcpClient 6.生成应用程序。P2P应用程序示例5-3在连接的另一侧,FileReceive应用程序会在文本框中显示已接收的文 件新建一个名为“Example3”的新Windows应用程序。将文件名Form1.cs更改为frmOrders Report.cs。设计一个带有名为txtDisplayFile文本框的窗体。4.在项目中添加命名空间。using System.Net;usingSystem.Net.Sockets;usingSystem.IO;private voidfrmFileReceive_Load(objectsender,System.EventArgse){ //指定机器的IP地址IPAddressobjIPAddress=IPAddress.Pars e("169.254.25.129");//新建侦听器TcpListenerobjTcpLi stener=newTcpListener(objIPAddress,2112);//启动Listene r对象objTcpListener.Start(); //接受客户端请求T cpClientobjTcpClient=objTcpListener.AcceptTcpClient(); //取得流NetworkStreamobjNetworkStream=objTcpClient.Get Stream();StreamReaderobjStreamReader=new StreamReader(objNetworkStream);stringresult=objStreamReader.ReadToEnd();//在文本框中显示内容this.txtDisplayFile.Text=result.ToString();objTcpClient.Close();objTcpListener.Stop();}P2P应用程序示例5-45.在frmFileReceive窗体的Load事件中添加代码。6.生成应用程序。运行应用程序:P2P应用程序示例5-5执行SendFile应用程序并输入所示的主机名和端口号。2.执行FileReceive应用程序,同时转到SendFile应用程序,并单击按钮。下面的输出结果显示在FileReceive应用程序中。文件接收应用程序TCP/IP协议的基本传输单位是数据包(datagram),TCP协议负责把数据分成若干个数据包,并给每个数据包加上包头(就像给一封信加上信封),包头上有相应的编号,以保证在数据接收端能将数据还原为原来的格式,IP协议在每个包头上再加上接收端主机地址,这样数据找到自己要去的地方(就像信封上要写明地址一样),如果传输过程中出现数据丢失、数据失真等情况,TCP协议会自动要求数据重新传输,并重新组包。总之,IP协议保证数据的传输,TCP协议保证数据传输的质量。 |
|