《第10章C#网络通信编程技术.ppt》由会员分享,可在线阅读,更多相关《第10章C#网络通信编程技术.ppt(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第10章 C#网络通信编程技术10.1 10.1 网络通信的方式网络通信的方式10.2 Dns10.2 Dns类类10.3 System.Net.Sockets10.3 System.Net.Sockets命名空间命名空间10.4 10.4 开发网络通信应用程序开发网络通信应用程序10.5 10.5 综合应用综合应用10.1 10.1 网络通信的方式网络通信的方式(1)同步方式同步方式是指发送方发送数据包以后,不等接收方响应,就接着发送下一个数据包。(2)异步方式异步方式是指当发送方发送一个数据包以后,一直等到接收方响应后,才可以发送下一个数据包。(3)阻塞套接字阻塞套接字是指在执行此套接字的
2、网络调用时,直到调用成功才返回,否则此套接字就一直阻塞在网络调用上。(4)非阻塞套接字非阻塞套接字是指在执行此套接字的网络调用时,不管是否执行成功,都立即返回。10.2 Dns10.2 Dns类类Dns类的常用方法及说明如表10.1所示。方 法 名 称说 明BeginGetHostAddresses异步返回指定主机的Internet协议(IP)地址BeginGetHostEntry已重载。将主机名或IP地址异步解析为IPHostEntry实例EndGetHostAddresses结束对DNS信息的异步请求EndGetHostEntry结束对DNS信息的异步请求GetHostAddresses返
3、回指定主机的Internet协议(IP)地址GetHostByAddress已重载。获取IP地址的DNS主机信息GetHostName获取本地计算机的主机名GetType获取当前实例的类型GetHostEntry将主机名或IP地址解析为IPHostEntry实例表10.1 Dns类的常用方法及说明10.2 Dns10.2 Dns类类【例例EX10_1EX10_1】设计设计WinFormWinForm应用程序用于获取指定主机名的应用程序用于获取指定主机名的IPIP地址。地址。设计步骤如下:(1)新建WinForm项目新建WinForm项目并命名为“EX10_1”。(2)添加控件并设置属性在For
4、m1的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“获取主机IP地址”。从工具箱中拖曳1个Button、2个Label和2个TextBox控件到窗体中,如图10.1所示布局控件。将label1、label2和button1的Text属性值分别设置为“主机名”、“IP地址:”和“获取”。(3)添加命名空间所要添加的命名空间为“using System.Net;”。10.2 Dns10.2 Dns类类(4)添加事件及代码双击“获取”按钮,其事件代码如下所示:private void button1_Click(object sender,EventArgs e)textBox2.T
5、ext=;try IPHostEntry hostInfo=Dns.GetHostEntry(textBox1.Text.Trim();foreach(IPAddress ipadd in hostInfo.AddressList)textBox2.Text+=ipadd.ToString()+rn;catch(Exception ex)MessageBox.Show(ex.Message.ToString();10.2 Dns10.2 Dns类类(5)运行程序按“Ctrl+F5”组合键运行程序,分别输入“”和“”,单击“获取”按钮,结果如图10.1和图10.2所示。图10.1 “”的IP地址
6、图10.2 “”的IP地址10.3 10.3 System.Net.Sockets命名空间命名空间(1)Socket类:用于管理连接,实现Berkeley通信端接口,定义绑定、连接网络端点以及传输数据所需的方法,提供处理端点连接传输等细节所需要的功能。WebRequest、TcpClient和UdpClinet等类在内部使用这个类。(2)TcpClient类:允许创建和使用TCP连接,该类创建于Socket类的基础之上并且封装了许多更高级的功能,避免开发人员处理连接操作的相关细节。(3)TcpListener类:允许监听传入的TCP连接请求,监听来自TCP客户端应用程序的连接要求,封装更高级的
7、功能,使用这个类可以让用户避免处理一些连接服务的细节,以一种比较有效的方式,接收监听的连接需求。(4)UdpClinet类:提供用户数据报(UDP)网络服务。(5)NetWorkStream类:这个类是从Stream派生出来的,专门用以处理网络形式的数据流,与其他文件数据流的显著区别在于,这个类接收Socket类对象参数,对网络数据进行存取操作。10.3.1 10.3.1 套接字(套接字(SocketSocket)应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的
8、应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,如图10.3所示。图10.3 套接字示意图10.3.1 10.3.1 套接字(套接字(SocketSocket)在基于TCP/IP的网络上进行通信的关键代码如下:Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);使用UDP而不是TCP进行通信的关键代码如下:Socket socket=new Socket(AddressFamily.InterNetwork,S
9、ocketType.Dgram,ProtocolType.Udp);参数说明如下:(1)AddressFamily:AddressFamily枚举,用来指定Socket类解析网络地址的标准地址族。(2)SocketType:SocketType枚举,用来指定套接字的类型。(3)ProtocolType:ProtocolType枚举,用来指定在Socket上通信时使用的网络协议。创建Socket类后,既可以开始与远程终结点的连接,也可以接收来自远程设备的连接。10.3.2 Socket10.3.2 Socket类的属性和方法类的属性和方法连接创建完毕,就可以使用其Send或SendTo方法将数据
10、发送到Socket;同样使用其Receive或ReceiveFrom方法从Socket中读取数据。在Socket使用完毕后,应使用其Shutdown方法禁用Socket,并使用Close方法关闭Socket。表10.2和表10.3分别是Socket类中的常用属性和方法及其简要说明。【例例EX10_2EX10_2】设计设计WinFormWinForm应用程序将小写字母转换为大写字母,应用程序将小写字母转换为大写字母,其中包括客户端和服务端,利用其中包括客户端和服务端,利用SocketSocket将要转换的小写字母发送给服务将要转换的小写字母发送给服务端,服务端将接收到的小写字母转换为大写字母并返
11、回给客户端。端,服务端将接收到的小写字母转换为大写字母并返回给客户端。设计步骤如下:(1)新建客户端WinForm项目新建WinForm项目并命名为“EX10_2_client”。(2)添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“客户端”。从工具箱中拖曳1个Button、2个Label和2个TextBox控件到窗体中,如图10.4所示布局控件。将label1、label2和button1的Text属性值分别设置为“发送的字符串:”、“接收并转换为大写的字符串:”和“转换”。10.3.2 Socket10.3.2 Socket类的属性和方法类的属
12、性和方法(3)添加命名空间所要添加的命名空间为:using System.Net;using System.Net.Sockets;(4)添加事件及代码双击“转换”按钮,其事件代码如下所示。(5)新建服务端WinForm项目新建WinForm项目并命名为“EX10_2_server”。(6)添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“服务端”。从工具箱中拖曳1个Button、1个Label和1个TextBox控件到窗体中,如图10.5所示布局控件。将label1和button1的Text属性值分别设置为“从客户端接收的字符串:”、“开始监听”。
13、(7)添加命名空间所要添加的命名空间为:using System.Net;using System.Net.Sockets;10.3.2 Socket10.3.2 Socket类的属性和方法类的属性和方法(8)添加事件及代码双击“开始监听”按钮,其事件代码如下所示。(9)运行程序运行这两个程序,单击服务端的“开始监听”按钮,在客户端中输入一些小写字符串并单击“转换”按钮,结果如图10.4和图10.5所示。图10.4 客户端 图10.5 服务端10.4 10.4 开发网络通信应用程序开发网络通信应用程序10.4.1 TcpClient10.4.1 TcpClient类类为使TcpClient连接
14、并交换数据,使用TCP协议创建的TcpListener或Socket必须监听是否有传入的连接请求。可以使用下面两种方法之一连接到该监听器:(1)创建一个TcpClient,并调用三个可用的Connect方法之一:TcpClient tcpClient=new TcpClient();/创建一个TcpClient/*使用下面三种方法之一连接到监听器*/tcpClient.Connect(IPAddress,Int32)/使用指定的 IP地址和端口号将客户端连接到 TCP 主机tcpClient.Connect(IPAddress,Int32)/使用指定的IP地址和端口号将客户端连接到远程TCP主
15、机tcpClient.Connect(String,Int32)/将客户端连接到指定主机上的指定端口10.4.1 TcpClient10.4.1 TcpClient类类(2)使用远程主机的主机名和端口号创建TcpClient。此构造函数将自动尝试一个连接。TcpClient client=new TcpClient(hostname,port);要发送和接收数据,可以使用GetStream方法来获取一个NetworkStream,调用NetworkStream的Write和Read方法与远程主机之间发送和接收数据。使用Close方法释放与TcpClient关联的所有资源。TcpClient的常
16、用属性及说明如表10.4所示,常用方法及说明如表10.5所示。10.4.2 TcpListener10.4.2 TcpListener类类TcpListener类从TCP网络客户端监听连接。TcpListener类提供一些简单方法,用于在阻塞同步模式下监听和接收传入连接请求。可使用IPEndPoint、本地IP地址及端口号或者仅使用端口号,来创建TcpListener。创建监听器的两种方法如下:(1)使用指定的本地终结点初始化TcpListener类的新实例。TcpListener tcpListener=new TcpListener(IPEndPoint)(2)使用指定的本地IP地址和端口
17、号,监听是否有传入的连接尝试。TcpListener tcpListener=new TcpListener(IPAddress,Int32)可使用TcpClient或Socket来连接TcpListener。可以将本地IP地址指定为Any,将本地端口号指定为0(如果希望基础服务提供程序为程序员分配这些值)。如果这样做,可在连接套接字后使用LocalEndpoint 属性来标识已指定的信息。10.4.2 TcpListener10.4.2 TcpListener类类Start方法用来开始监听传入的连接请求。Start 将对传入连接进行排队,直至调用Stop方法或它已经完成MaxConnecti
18、ons排队为止。可使用 AcceptSocket或AcceptTcpClient从传入连接请求队列中提取连接。这两种方法将阻止。如果要避免阻止,可首先使用Pending方法来确定队列中是否有可用的连接请求。TcpListener类的常用属性和方法及说明如表10.6和表10.7所示。10.4.3 NetWorkStream10.4.3 NetWorkStream类类以下是创建NetworkStream的几种方法。(1)为指定的Socket创建NetworkStream类的新实例。NetworkStream networkStream=new NetworkStream(Socket)(2)用指定
19、的Socket 所属权为指定的Socket初始化NetworkStream类的新实例。NetworkStream networkStream=new NetworkStream(Socket,Boolean)(3)用指定的访问权限为指定的Socket 创建NetworkStream类的新实例。NetworkStream networkStream=new NetworkStream(Socket,FileAccess)(4)用指定的访问权限和指定的Socket所属权为指定的Socket创建NetworkStream类的新实例。NetworkStream networkStream=new Ne
20、tworkStream(Socket,FileAccess,Boolean)10.4.3 NetWorkStream10.4.3 NetWorkStream类类NetworkStream不支持对网络数据流的随机访问。CanSeek属性用于指示流是否支持查找,它的值始终为false。读取Position属性、读取Length属性或者调用 Seek方法都会引发NotSupportedException异常。NetworkStream类的常用属性和方法及说明如表10.8和表10.9所示。【例例EX10_3EX10_3】设计设计WinFormWinForm应用程序发送并接收文件,其中包括发应用程序发送
21、并接收文件,其中包括发送文件和接收文件两端。送文件和接收文件两端。设计步骤如下:(1)新建发送文件端WinForm项目新建WinForm项目并命名为“EX10_3_sendfile”。(2)添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“发送文件”。从工具箱中拖曳1个Button控件到窗体中,如图10.6所示布局控件。将button1的Text属性值设置为“选择文件并发送”。10.4.3 NetWorkStream10.4.3 NetWorkStream类类(3)添加命名空间所要添加的命名空间为:using System.Net;using Sys
22、tem.Net.Sockets;using System.IO;(4)添加事件及代码双击“选择文件并发送”按钮,其事件代码如下所示。(5)新建接收文件端WinForm项目新建WinForm项目并命名为“EX10_3_receivefile”。(6)设置属性此窗体在运行时是不可见的,将Form1的“Text”属性设置为“接收文件”。10.4.3 NetWorkStream10.4.3 NetWorkStream类类(7)添加命名空间所要添加的命名空间为:using System.Net;using System.Net.Sockets;using System.IO;(8)添加事件及代码双击Fo
23、rm1窗体,其事件代码如下所示。10.4.3 NetWorkStream10.4.3 NetWorkStream类类(9)运行程序运行这两个程序,单击发送文件端的“选择文件并发送”按钮,弹出打开文件对话框,选择要发送的文件,此时接收文件端弹出保存文件对话框,输入要保存文件的文件名和后缀名,单击“保存”按钮,则文件接收成功。发送文件端运行的结果如图10.6所示。按“Ctrl+Alt+Del”组合键打开Windows任务管理器,关闭接收端进程,如图10.7所示。图10.6 发送文件端 图10.7 Windows任务管理器10.4.4 UdpClient10.4.4 UdpClient类类UdpCl
24、ient类是提供用户数据报(UDP)网络服务的。UdpClient类提供了一些简单的方法,用于在阻塞同步模式下发送和接收无连接UDP数据报。因为UDP是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但可以选择使用下面两种方法之一来建立默认远程主机:(1)使用远程主机名和端口号作为参数创建UdpClient类的实例。UdpClient udpClient=new UdpClient(hostname,port)(2)创建UdpClient类的实例,然后调用Connect方法。UdpClient udpClient=new UdpClient();/*使用下面三种方法之一建立默认远
25、程主机*/udpClient.Connect(IPEndPoint)/使用指定的网络终结点建立默认远程主机udpClient.Connect(IPAddress,Int32)/使用指定的IP地址和端口号建立默认远程主机udpClient.Connect(String,Int32)/使用指定的主机名和端口号建立默认远程主机10.4.4 UdpClient10.4.4 UdpClient类类可以使用在UdpClient中提供的任何一种发送方法将数据发送到远程设备。使用 Receive方法可以从远程主机接收数据。UdpClient类的常用属性和方法及说明如表10.10和表10.11所示。【例例EX1
26、0_4EX10_4】设计设计WinFormWinForm应用程序发送广播信息并接收广播信息,应用程序发送广播信息并接收广播信息,其中包括服务端和接收客户端,服务端用于发送广播信息而客户端用于其中包括服务端和接收客户端,服务端用于发送广播信息而客户端用于接收广播信息。接收广播信息。设计步骤如下:(1)新建服务端WinForm项目新建WinForm项目并命名为“EX10_4_server”。(2)添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“服务端”。从工具箱中拖曳1个Button、1个Label和1个Textbox控件到窗体中,如图10.8所示布局
27、控件。将button1的Text属性值设置为“开始广播”。10.4.4 UdpClient10.4.4 UdpClient类类(3)添加命名空间所要添加的命名空间为:using System.Net;using System.Net.Sockets;(4)添加事件及代码双击“开始广播”按钮,其事件代码如下所示:private void button1_Click(object sender,EventArgs e)UdpClient udpClient=new UdpClient();try udpClient.Connect(IPAddress.Parse(192.168.101.255),
28、5000);Byte sendBytes=Encoding.ASCII.GetBytes(textBox1.Text.Trim();udpClient.Send(sendBytes,sendBytes.Length);/发送信息 udpClient.Close();catch(Exception ex)Console.WriteLine(ex.Message.ToString();10.4.4 UdpClient10.4.4 UdpClient类类(5)新建客户端WinForm项目新建WinForm项目并命名为“EX10_4_client”。(6)设置属性在Form1的设计视图中将此窗体调整到
29、适当的大小并将“Text”属性设置为“客户端”。从工具箱中拖曳1个Button、1个Label和1个Textbox控件到窗体中,如图10.9所示布局控件。将button1的Text属性值设置为“开始监听”。(7)添加命名空间所要添加的命名空间为:using System.Net;using System.Net.Sockets;10.4.4 UdpClient10.4.4 UdpClient类类(8)添加事件及代码双击Form1窗体,其事件代码如下所示:private void Form1_Load(object sender,EventArgs e)UdpClient udpClient=n
30、ew UdpClient(5000);try IPEndPoint RemoteIpEndPoint=new IPEndPoint(IPAddress.Any,0);Byte receiveBytes=udpClient.Receive(ref RemoteIpEndPoint);/接收消息 string returnData=Encoding.ASCII.GetString(receiveBytes);textBox1.Text=消息来源IP:+RemoteIpEndPoint.Address.ToString()+端口号:+RemoteIpEndPoint.Port.ToString()+
31、rn内容:+returnData.ToString();udpClient.Close();/释放对象 catch(Exception ex)Console.WriteLine(ex.Message);10.4.4 UdpClient10.4.4 UdpClient类类(9)运行程序运行这两个程序,单击客户端的“开始监听”按钮,开始监听广播信息。在服务端中输入“今天下午3点钟有会!”并单击“开始广播”按钮,如图10.8所示。客户端接收消息并显示,如图10.9所示。图10.8 服务端 图10.9 客户端10.5 10.5 综合应用综合应用【例例EX10_5EX10_5】设计点对点聊天设计点对点聊
32、天WinFormWinForm应用程序,当采用如图应用程序,当采用如图10.1010.10所示的这种模式时,就是所谓的完全点对点模式,此时每台计算机本身所示的这种模式时,就是所谓的完全点对点模式,此时每台计算机本身也是服务器,因为它需要进行端口的监听。也是服务器,因为它需要进行端口的监听。图10.10 点对点聊天示意图10.5 10.5 综合应用综合应用设计步骤如下:(1)新建服务端WinForm项目新建WinForm项目并命名为“EX10_5”。(2)添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“聊天系统”。从工具箱中拖曳3个Button、4个
33、Label、4个Textbox和1个StatusStrip控件到窗体中,如图10.11所示布局控件。textBox1、textBox2、textBox3和textBox4分别用于输入目标计算机地址、昵称、发送内容和接收聊天内容。将label1、label2、label3和label4的Text属性值分别设置为“目标计算机地址”、“昵称”、“发送内容”和“聊天内容”。将button1、button2和button3的Text属性值分别设置为“开始监听”、“停止监听”和“发送信息”。在状态栏statusStrip1中添加1个toolStripStatusLabel。10.5 10.5 综合应用综合应用(3)添加命名空间所要添加的命名空间为:using System.Net;using System.Net.Sockets;using System.IO;using System.Threading;(4)添加事件及代码切换到窗体设计器中,分别双击3个按钮,添加事件及代码,代码如下所示。10.5 10.5 综合应用综合应用(5)运行程序按“Ctrl+F5”组合键运行此程序,为了方便,在这里目标计算机IP地址就输入本机IP地址“192.168.101.204”,昵称设置为“沙漠之鹰”,单击“开始监听”按钮,输入发送内容,单击“发送消息”按钮,结果如图10.11所示。图10.11 聊天系统
限制150内