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