《2022年C#网络通信 .pdf》由会员分享,可在线阅读,更多相关《2022年C#网络通信 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C#网络通信1.网络通信的方式1)同步方式同步方式是指当发送方发送一个数据包以后,一直等到接收方响应后, 才可以发送下一个数据包。 (串行运行 ) 2)异步方式异步方式是指发送方发送数据包以后,不等接收方响应, 就接着发送下一个数据包。 (并行运行 ) 3)阻塞套接字阻塞套接字是指在执行此套接字的网络调用时,直到调用成功才返回, 否则此套接字就一直阻塞在网络调用上。4)非阻塞套接字非阻塞套接字是指在执行此套接字的网络调用时,不管是否执行成功, 都立即返回。2.Dns类、IPAddress类、IPEndPoint 类和 IPHostEntry 类1)Dns类Dns类是一个静态类,它从Intern
2、et 域名系统(DNS) 检索关于特定主机的信息。在IPHostEntry 类的实例中返回来自DNS 查询的主机信息。如果指定的主机在DNS 数据库中有多个入口,则IPHostEntry 包含多个IP 地址和别名。常用方法说明方 法 名 称说明BeginGetHostAddresses异步返回指定主机的Internet 协议( IP)地址BeginGetHostEntry已重载。将主机名或IP 地址异步解析为IPHostEntry 实例EndGetHostAddresses结束对 DNS 信息的异步请求EndGetHostEntry结束对 DNS 信息的异步请求GetHostAddresses
3、返回指定主机的Internet 协议( IP)地址GetHostByAddress已重载。获取IP 地址的 DNS 主机信息GetHostName获取本地计算机的主机名名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - GetType获取当前实例的类型GetHostEntry将主机名或IP 地址解析为IPHostEntry 实例2)IPAddress类IPAddress类提供了对 IP 地址的转换、处理等功能。其Parse方法可将
4、 IP 地址字符串转换为 IPAddress实例。如:IPAddress ip = IPAddress.Parse( “192.168.1.1”); 3)IPEndPoint类IPEndPoint 类包含了应用程序连接到主机上的服务所需的IP 地址和端口信息。4)IPHostEntry 类IPHostEntry 类将一个域名系统(DNS) 主机名与一组别名和一组匹配的IP 地址关联。常用属性有: AddressList属性和 HostName属性。AddressList 属性 作用 :获 取或设 置与主 机关 联的 IP 地址 列表, 是一个IPAddress类型的数组,包含了指定主机的所有I
5、P 地址; HostName属性则包含了服务器的主机名。在 Dns 类中,有一个专门获取IPHostEntry 对象的方法,通过IPHostEntry对象,可以获取本地或远程主机的相关IP 地址。例子: 设计 WinForm 应用程序用于获取指定主机名的IP 地址。设计步骤如下:新建 WinForm 项目新建 WinForm 项目并命名为“ ParseDNS ” 。添加控件并设置属性在 Form1 的设计视图中将此窗体调整到适当的大小并将“Text”属性设置为“获取主机 IP 地址” 。从工具箱中拖曳1 个 Button、2 个 Label 和 2个 TextBox控件到窗体中,如图10.1
6、所示布局控件。将label1、label2 和 button1 的 Text属性值分别设置为“主机名” 、 “IP 地址: ”和“获取”。添加命名空间所要添加的命名空间为“ using System.Net; ” 。添加事件及代码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 双击“获取”按钮,其事件代码如下所示:private void button1_Click(object sender, EventArgs e) te
7、xtBox2.Text = ; try IPHostEntry hostInfo = Dns .GetHostEntry(textBox1.Text.Trim(); textBox2.Text = 主机名: + Dns .GetHostName() + rn; foreach ( IPAddress ipadd in hostInfo.AddressList) textBox2.Text += ipadd.ToString() + rn; catch ( Exception ex) MessageBox .Show(ex.Message.ToString(); 运行程序按“Ctrl+F5”组合
8、键运行程序, 分别输入“”和“” ,单击“获取”按钮,结果如图1 和图 2 所示。图 1 图 2 2.System.Net.Socket命名空间TCP/IP的 Socket则提供 3 种类型的套接字。该接口允许对较低层协议,如IP、ICMP 直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。套接字处理数据两种基本模式:同步套接字和异步套接字。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 同步套接字其特点是在通过S
9、ocket 进行连接、接收、发送操作时,客户机或服务器在接收到对方响应前会处于阻塞状态。它适用于数据处理不太多的场合。异步套接字在通过 Socket 进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用 callback机制进行连接、接收和发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。IP 连接领域有两种通信类型:面向连接的 (connection-oriented) (TCP) 在面向连接的套接字中, 使用 TCP 协议来建立两个 IP 地址端点之间的会话。一旦建立了这种连接,就可以在设备之间可靠的传输数据。无连接的 (connectionles
10、s) (UDP) 为了建立面向连接的套接字,服务器和客户端必须分别进行编程。对于服务器端程序,建立的套接字必须绑定到用于TCP通信的本地 IP 地址和端口上。网络流流(stream)是对串行传输的数据的一种抽象表示,底层的设备可以是文件、外部设备、主存、网络套接字等。C#在 System.Net.Sockets 名称空间中提供了一个专门的NetworkStream 类,用于通过网络套接字发送和接收数据。NetworkStream类支持对网络数据的同步或异步访问,它可被视为在数据来源端和接收端之间架设了一个数据通道。1)Socket类.NET 框架的 System.NET.Sockets命名空间
11、为需要严密控制网络访问的开发人员提供了 WinSock 接口的托管实现。Socket类用于实现 Berkeley 套接字接口。Socket类的构造函数Socket类的构造函数原型如下:public Socket( AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - ); 构造函
12、数使用 3 个参数来定义创建的Socket实例。 AddressFamily用来指定网络类型; SocketType 用来指定套接字类型(即数据连接方式);ProtocolType用来指定网络协议。 3 个参数均是在命名空间System.Net.Sockets中定义的枚举类型。但它们并不能任意组合, 不当的组合反而会导致无效套接字。如对于常规的 IP 通信网络, AddressFamily 只能使用 AddressFamily.InterNetwork,此时可用的 SocketType 、ProtocolType组合如表 1 所示。SocketType 值ProtocolType 值描述Str
13、eamTcp面向连接套接字DgramUdp无连接套接字RawIcmp网际消息控制协议套接字RawRaw基础传输协议套接字表 1 2)TcpClient 类TcpClient类为 TCP 网络服务提供客户端连接,它构建于Socket类之上,以提供较高级别的TCP 服务,即提供了通过网络连接、发送和接收数据的简单方法。用于在同步阻止模式下通过网络来连接、发送和接收流数据 。另外,通过与NetworkStream对象的关联,使得用户可以通过流操作方式实现对网络连接状态下数据的发送和接收。通过 TcpClient 类实现与 TCP 主机的通信流程如图3 所示。名师资料总结 - - -精品资料欢迎下载
14、- - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 图 3 TcpClient类与 TCP 主机的通信流程1创建 TcpClient 实例TcpClient类有 4 种构造函数的重载形式,分别对应4 种创建实例的方法。TcpClient( ),这种不带任何参数的构造函数将使用本机默认的IP 地址并将使用默认的通信端口号0。当然,如果本机不止一个IP 地址时将无法选择使用。TcpClient (AddressFamily) ,使用指定的地址族初始化TcpClient类的新实
15、例。TcpClient(IPEndPoint) ,即使用本机 IPEndPoint创建 TcpClient的实例。其中 IPEndPoint 将网络端点表示为IP 地址和端口号,用于指定在建立远程主机连接时所使用的本地网络接口IP 地址和端口号。TcpClient (String, Int32) ,初始化TcpClient 类的新实例并连接到指定主机上的指定端口。因此,在 TcpClient 的构造函数中,如果没有指定远程主机名和端口号,它只是用来实例化 TcpClient,同时实现与本地IP 地址和 Port 端口的绑定。2与远程主机建立连接如果在 TcpClient 的实例化过程中没有实现
16、与远程主机的连接,则可以通过Connect 方法来实现与指定远程主机的连接。Connect 方法使用指定的主机名和端口号将客户端连接到远程主机,其使用方法如下。Connect(IPEndPoint) ,使用指定的远程网络终结点将客户端连接到远程TCP 主机。Connect (IPAddress ) ,使用指定的IP 地址和端口号将客户端连接到远程TCP 主机。Connect (IPAddress,Int32) ,使用指定的IP 地址和端口号将客户端连接到远程 TCP 主机。Connect (String, Int32) ,使用指定的主机名和端口号将客户端连接到指定主机上的指定端口。如下代码段描
17、述了TcpClient 实例的创建以及与指定远程主机的连接过程。m_client = new TcpClient( ); m_client.Connect(m_servername, m_port); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 3利用 NetworkStream实例发送和接收数据TcpClient类创建在 Socket之上,提供了更高层次的TCP 服务抽象,特别是在网络数据的发送和接收方面,TcpClie
18、nt 使用标准的 Stream流处理技术,通过使用 NetworkStream实例的读写操作来实现网络数据的接收和发送,因此更加方便直观。但 NetworkStream与普通流 Stream有所不同, NetworkStream没有当前位置的概念,不支持查找和对数据流的随机访问。该方法首先通过 TcpClient.GetStream来返回 NetworkStream 实例,进而利用所获取的 NetworkStream实例的读写方法Write 和 Read来发送和接收数据,其实现代码如下所示。rs = new StreamReader(m_client.GetStream( );/ 获取接收数据
19、的网络流实例ws = m_client.GetStream( ); / 获取发送数据的网络流实例m_returnData = rs.ReadLine( ); / 接收网络数据Console.WriteLine(m_returnData); ws.Write(data, 0, data.Length); / 向网络发送数据4关闭 TCP 套接字在与服务器完成通信后,应该调用Close( )方法释放所有的资源。m_client.Close( ); 3)TcpListener类TcpClient 类实现了客户端编程抽象,因此构建客户端网络应用程序便可以直接使用 TcpClient 取代 Socket
20、,更加方便易用。同样,对于服务器端应用程序的构建, C#提供了 TcpListener类。该类也是构建于Socket之上,提供了更高抽象级别的 TCP 服务,使得程序员能更方便地编写服务器端应用程序。通常情况下,服务器端应用程序在启动时将首先绑定本地网络接口的IP 地址和端口号, 然后进入侦听客户请求的状态,以便于客户端应用程序提出显式请求。 一旦侦听到有客户端应用程序请求连接侦听端口,服务器端应用将接受请求,并建立一个负责与客户端应用程序通信的信道,即通过创建连接套接字与客户端应用程序建立连接, 由连接套接字完成与客户端应用程序的数据传送操作,服务器端应用程序继续侦听更多的客户端连接请求。T
21、cpListener通过实例创建过程完成与本地网络接口的绑定,并由所创建的实名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 例调用 Start 方法启动侦听;当侦听到客户端应用程序的连接请求后,根据客户端应用程序的不同请求方式,可以通过AcceptTcpClient 方法接受传入的连接请求并创建 TcpClient 实例以处理请求,或者通过AcceptSocket方法接受传入的连接请求并创建Socket 实例以处理请求,并由所
22、创建的TcpClient 实例或 Socket实例完成与客户端应用程序的网络数据传输。最后,需要使用Stop 关闭用于侦听传入连接的 Socket,同时也必须关闭从AcceptSocket 或 AcceptTcpClient 返回的任何实例,以释放相关资源。其实现流程如右图4所示。图 4 TcpListener类与客户机的通信流程1创建 TcpListener实例TcpListener类提供了 3 种构造函数的重载形式来创建TcpListener实例。TcpListener(port); /指定本机端口public TcpListener(IPEndPoint) /指定本机终结点public
23、TcpListener(IPAddress,port) / 指定本机 IP 地址及端口分别根据指定的侦听端口、IPEndPoint 对象(包含了IP 地址和端口号)、IPAddress对象和端口号来创建TcpListener实例,并且实现与默认端口或指定IP地址和端口的绑定,如:m_host = IPAddress.Parse(m_serverIP); m_Listener = new TcpListener(m_host, m_port); 2侦听创建 TcpListener实例后,便可以调用Start方法启动侦听,即该方法将调用名师资料总结 - - -精品资料欢迎下载 - - - - -
24、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - TcpListener实例的基础 Socket上的 Listen方法,开始侦听客户的连接请求,如:m_Listener.Start( ); 3接收连接请求当侦听到有客户连接请求时,可以使用AcceptSocket或 AcceptTcpClient 接收任何当前在队列中挂起的连接请求。这两种方法分别返回一个Socket 或TcpClient 实例以接受客户的连接请求,如:TcpClient m_client = m_Listener.Acce
25、ptTcpClient( ); 通过返回的 Socket或 TcpClient 实例来实现与提出连接请求的客户的单独网络数据传输。4收发数据如果接收连接请求时返回的是Socket实例,则可以用 Send和 Receive方法实现与客户的通信。 如果返回的是 TcpClient实例,则可以通过对 NetworkStream的读写来实现与客户的数据通信。 由于服务器可以同时与多个客户建立连接并进行数据通信, 因此往往会引入多线程技术,为每个客户的连接建立一个线程,在该线程中实现与客户的数据通信。如下代码所示。/为每个客户连接创建并启动一个线程TcpClient m_client = m_Liste
26、ner.AcceptTcpClient( ); ClientHandle m_handle = new ClientHandle( ); m_handle.ClientSocket = m_client; Thread m_clientthread = new Thread(new ThreadStart(m_handle.ResponseClient); m_clientthread.Start( ); /线程处理代码public void ResponseClient( ) if (m_clientsocket != null) StreamReader rs = new StreamRe
27、ader(m_clientsocket.GetStream( ); NetworkStream ws = m_clientsocket.GetStream( ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - ,while (true) /接收信息m_returnData = rs.ReadLine( ); ,/回送信息ws.Write(data, 0, data.Length); , m_clientsocket.Clos
28、e( ); 5关闭连接与客户程序通信完成之后,最后一步是停止侦听套接字,此时可以调用TcpListener的 Stop方法来实现。4)UdpClient 类与 TcpClient 和 TcpListener 类似, UdpClient 也是构建于 Socket类之上,提供了更高层次的 UDP 服务抽象,用于在阻止同步模式下发送和接收无连接UDP 数据报,使用简单直观。基于 UdpClient 的网络应用编程首先需要创建一个UdpClient 类实例,接着通过调用其 Connect方法连接到远程主机。 当然,这两步也可以直接由指定远程主机名和端口号的UdpClient 类构造函数完成。然后便可以
29、利用Send和 Receive方法来发送和接收数据。最后调用Close方法关闭 UDP 连接,并释放相关资源。其实现流程如图 5 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 图 6 基于 UdpClient 的编程流程5)NetWorkStream类NetworkStream 类提供在阻止模式下通过Stream 套接字发送和接收数据的方法。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -