--------------基于C#语言主讲教师:钱哨本课学时:72课时联系方式:qianshao@bjjtxy.bj.cnWindows程序设计第七章、WinForms网络编程本章主要内容介绍7.1windows和窗体7.2VisualStutio.netIDE简介7.3事件处理CONTENT本章学习目标:•了解组网•通过WinForms访问Internet•通过WinForms进行套接字编程组网简介3-1打印机在物理上连接至单台计算机连接在网络上的多位用户打印?打印?打印?组网是指将网络中的计算机连接在一起可共享打印机以供网络中所有用户使用降低了为每个用户采购打印机而带来的成本,充分利用资源组网简介3-2``````共享资源组网是将许多设备(如计算机、打印机和工作站)连接成一个网络以共享资源WinForms网络编程中用到System.Net和System.Net.Sockets命名空间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地址模式标识符标识用于通信的协议可选查询字符串将信息从客户端传递至服务器=/library/en-us/cpguide/html/cpconrequestingdata.asp访问Internet6-3System.NetWebClientWebRequestWebResponse发送或接收来自统一资源标识符的数据向统一资源标识符发出请求得到统一资源标识符发出的响应访问Internet6-4属性HeadersQueryString方法DownloadData()DownloadFile()OpenRead()OpenWrite()UploadFile()WebClient类的属性和方法创建如下所示的窗体2.将下列名称空间添加至窗体。usingSystem.Net;usingSystem.IO;3.在按钮btnGo的Click事件中添加下列代码,以从文本框输入的URI中读取数据。privatevoidbtnGo_Click(objectsender,System.EventArgse){WebClientclient=newWebClient();Streamstrm=client.OpenRead(txtURI.Text);StreamReadersr=newStreamReader(strm);stringline;while((line=sr.ReadLine())!=null){lstRecd.Items.Add(line);}strm.Close();}访问Internet6-5WebRequest类抽象类封装与服务器连接、发送请求和接收响应的详细信息使用传递至其Create()方法的URI值创建特定于协议的实例对WebRequest实例调用的GetResponse()方法帮助向Internet资源发出请求属性MethodRequestUri方法Create()GetRequestStream()GetResponse()访问Internet6-6WebResponse类抽象类提供来自URI的响应。客户端应用程序不创建WebResponse对象,因为在对WebRequest实例调用GetResponse()方法时会创建它们。privatevoidbtnGo_Click(objectsender,System.EventArgse){WebRequestwrq=WebRequest.Create(txtURI.Text);WebResponsewrs=wrq.GetResponse();Streamstrm=wrs.GetResponseStream();StreamReadersr=newStreamReader(strm);stringline;while((line=sr.ReadLine())!=null){lstRecd.Items.Add(line);}strm.Close();}使用WebRequest和WebResponse类实现“执行”按钮的功能套接字编程System.Net.SocketsSocketTcpClientTcpListenerUdpClientSystem.Net.Sockets名称空间包含允许直接发送TCP网络请求或侦听特定端口上的TCP网络请求的相关类大量的方法和属性用于网络连接提供客户端连接,用于创建和使用TCP网络服务可用于从TCP网络客户端侦听连接可用于为UDP客户端创建连接(它是TCP的备用协议,在本地网络上使用)使用TCP类•TCP(TransfersControlProtocol,传输控制协议)类包含连接两个点并在这两个点之间发送数据的方法•一个点由IP地址和端口号组成。现有协议具有定义好的端口号•HTTP使用端口号80;SMPT或电子邮件使用端口号25;FTP使用端口号21•InternetAssignedNumberAuthority(IANA,Internet编号分配管理机构)负责为这些有名的服务分配端口号•TCP提供有保证的传送、错误更正和数据缓冲•TcpClient类具有通过网络连接、发送和接收流数据的简单方法•TcpListener类具有侦听进入的TCP连接的方法0TcpClient对象属性说明ReceiveBufferSize获取或设置接收缓冲区的大小SendBufferSize获取或设置发送缓冲区的大小方法说明Close关闭所有TCP连接并释放与TcpClient关联的资源Connect将使用主机名和端口号将客户端连接至远程TCP主机GetStream返回用于发送和接收数据的NetworkStreamTCPListener类的方法方法说明AcceptSocket返回与远程客户端通信的套接字AcceptTcpClient接受暂挂的连接请求Start开始侦听进入的连接请求Stop关闭侦听器TcpListener类具有侦听进入的TCP连接的方法,其中Start()方法用于开始侦听进入的连接请求,并且将把进入的连接放置在队列中,直到调用Stop()为止。AcceptSocket()或AcceptTcpClient()方法可用于从进入的连接请求队列中提取连接。TCP类应用程序实例8-1将以下两个名称空间添加至窗体usingSystem.Net.Sockets;usingSystem.IO;在窗体的声明区域中声明下列变量publicTcpListenertcpListener;privateNetworkStreamnetworkStream;privateStreamReaderstreamReader;privateStreamWriterstreamWriter;publicSocketsocketForClient;TCP类应用程序实例8-2privatevoidbtnstart_Click(objectsender,System.EventArgse){tcpListener=newTcpListener(1234);tcpListener.Start();MessageBox.Show(服务器已启动);socketForClient=tcpListener.AcceptSocket();networkStream=newNetworkStream(socketForClient);streamWriter=newStreamWriter(networkStream);streamReader=newStreamReader(networkStream);try{if(socketForClient.Connected){MessageBox.Show(客户端已连接);stringline=streamReader.ReadLine();txtServerClient.Text=line;line=line.ToUpper()+!;streamWriter.WriteLine(line);txtServerServer.Text=line;streamWriter.Flush();}}catch(Exceptionae){Console.WriteLine(ae.ToString());}}在按钮btnstart的Click事件中添加下列代码TCP类应用程序实例8-3privatevoidbtnRecd_Click(objectsender,System.EventArgse){try{if(socketForClient.Connected){stringline=streamReader.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(“这将关闭服务器。您是否确实要关闭它?,提示框,MessageBoxButtons.YesNo);if(answer==DialogResult.Yes){Application.Exit();}if(answer==DialogResult.No){e.Cancel=true;}socketForClient.Close();}在窗体Form1的Closing事件中添加下列代码,以关闭所有连接TCP类应用程序实例8-5将以下两个名称空间添加至窗体usingSystem.Net.Sockets;usingSystem.IO;声明下列变量TcpClientmyclient;privateNetworkStreamnetworkStream;privateStreamReaderstreamReader;privateStreamWriterstreamWriter;控件按钮名称btnSendTCP类应用程序实例8-6在窗体的构造函数中添加代码,以在特定端口建立与服务器的连接publicForm1(){InitializeComponent();try{myclient=newTcpClient(localhost,1234);}catch{MessageBox.Show(未能