网络编程技术教程.ppt

上传人:本田雅阁 文档编号:3226656 上传时间:2019-08-02 格式:PPT 页数:49 大小:551.01KB
返回 下载 相关 举报
网络编程技术教程.ppt_第1页
第1页 / 共49页
网络编程技术教程.ppt_第2页
第2页 / 共49页
网络编程技术教程.ppt_第3页
第3页 / 共49页
网络编程技术教程.ppt_第4页
第4页 / 共49页
网络编程技术教程.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《网络编程技术教程.ppt》由会员分享,可在线阅读,更多相关《网络编程技术教程.ppt(49页珍藏版)》请在三一文库上搜索。

1、C#网络编程技术教程,第六章 TCP/UDP编程,学习目标,了解TCP和UDP。 掌握C#中面向TCP和UDP编程的主要类:TcpClient、TcpListener和UdpClient。 掌握TcpClient、TcpListener和UdpClient的编程方法。 了解多播的原理,掌握基于UdpClient的多播编程方法。,本章内容,6.1 TCP/UDP概述 6.2 .NET中的TCP编程基础 6.3 基于TCP的编程实例 6.4 .NET中的UDP编程基础 6.5 多播编程,6.1 TCP/UDP概述,在TCP/IP协议族中,传输层主要包括TCP和UDP两种通信协议,它们以不同的方式实

2、现两台主机中的不同应用程序之间的数据传输,即数据的端到端传输。由于它们的实现方式不同,因此各有一套属于自己的端口号,且相互独立。可以采用如下五元组来描述两个应用进程之间的通信关联。 (协议,信源机IP地址,信源应用进程端口,信宿机IP地址,信宿应用进程端口)即端到端之间的一条通信连接就可以表示为上述五元组,这也是进行网络程序设计最基本的概念。 其中,传输控制协议(Transmission Control Protocol,TCP)提供一种面向连接的、可靠的数据传输服务,保证了端到端数据传输的可靠性。也正因为这样,使TCP协议成为传输层最常用的协议,同时也是一个比较复杂的协议,其提供了传输层几乎

3、所有的功能。因此和IP协议一样,成为了 TCP/IP协议族中最重要的协议之一。其主要特点如下: (1)向应用进程提供面向连接的服务,两个需要通过TCP协议进行数据传输的应用进程之间首先必须建立一个TCP连接,并且在数据传输完成后要释放连接。一般将请求连接的应用进程称为客户进程,而响应连接请求的应用进程称为服务器进程,即TCP连接的建立采用的是一种客户机/服务器工作模型。 (2)提供全双工数据传输服务,只要建立了TCP连接,就能在两个应用进程间进行双向的数据传输服务,但是这种传输只是端到端的传输,不支持广播和多播。,6.1 TCP/UDP概述,(3)提供面向字节流的服务,即TCP协议的数据传输是

4、面向字节流的,两个建立了TCP连接的应用进程之间交换的是字节流。发送进程以字节流形式发送数据,接收进程也把数据作为字节流来接收。端到端之间不保留数据记录的边界,也就是说,在传输的层面上不存在数据记录的概念。 用户数据报协议(User Datagram Protocol,UDP)是传输层的两个主要协议之一,相对TCP协议来说,UDP是一种非常简单的协议,在网络层的基础上实现了应用进程之间端到端的通信。与TCP协议不同,UDP协议是一种无连接的协议,数据在传输之前通信双方不需要建立连接。信宿在收到UDP数据报之后也不需要给出任何应答报文。发送方发出的每一个UDP用户数据报都是独立的,都携带了完整的

5、目的地址。每个数据报都可以被网络系统独立路由。因此从同一个信源发往同一个信宿的多个UDP报文可能选择不同的路径达到信宿,它们达到的先后顺序也可能不同于发送顺序。所以,UDP协议提供的是一种无连接的、不可靠的数据传输方式,在数据传输过程中没有流量控制和确认机制,数据报可能会丢失、延迟、乱序到达信宿。UDP协议只是提供了利用校验和检查数据完整性的简单差错控制,属于一种尽力而为的数据传输方式。 虽然UDP用户数据报只提供不可靠的传输方式,但它具有其自身的一些特点: (1)UDP是一个无连接协议,传输数据之前信源和信宿不需要建立连接,因此不存在连接建立的时延。在信源端,UDP传送数据的速度仅仅受应用程

6、序生成数据的速度、计算机的能力和传输带宽的限制;在信宿端,UDP把每个数据报放在队列中,应用程序每次从队列中读一个数据报。,6.1 TCP/UDP概述,(2)由于传输数据不需要建立连接,也就不需要维护连接状态,包括收发状态等,这样一台服务机可同时向多个客户机传输相同的数据,例如实现多播。 (3)UDP数据报的首部很短,只有8字节,相对于TCP的20字节首部的开销要小很多。 (4)吞吐量不受流量控制算法的调节,只受应用软件生成数据的速率、传输带宽、信源和信宿主机性能的限制。 由于UDP具有这些特点,有许多应用更适合使用UDP协议,如: (1)只需要简单数据交换的应用,例如DNS服务,它不需要复杂

7、的可靠性保证机制,这样,利用UDP来传输数据既可以节省系统开销又提高了网络的传输效率。 (2)不需要关心数据的差错控制和流量控制的应用。 (3)实时性要求较高但可承受一定的数据错误的应用,例如实时语音传输、实时视频通信等。 (4)实现一对多数据发送的应用,例如广播和组播。,6.2 .NET中的TCP编程基础,6.2.1 TcpClient类 TcpClient类为TCP网络服务提供客户端连接,它构建于Socket类之上,以提供较高级别的TCP服务,即提供了通过网络连接、发送和接收数据的简单方法。用于在同步阻止模式下通过网络来连接、发送和接收流数据。另外,通过与NetworkStream对象的关

8、联,使得用户可以通过流操作方式实现对网络连接状态下数据的发送和接收。TcpClient类的常见属性和方法分别见下表。,6.2 .NET中的TCP编程基础,6.2.1 TcpClient类,6.2 .NET中的TCP编程基础,6.2.1 TcpClient类 通过TcpClient类实现与TCP主机的通信流程如图所示。 1创建TcpClient实例 TcpClient类有4种构造函数的重载形式,分别对应4种创建实例的方法。 (1)TcpClient( ),这种不带任何参数的构造函数将使用本机默认的IP地址并将使用默认的通信端口号0。当然,如果本机不止一个IP地址时将无法选择使用。 (2)TcpC

9、lient(AddressFamily),使用指定的地址族初始化TcpClient类的新实例。 (3)TcpClient(IPEndPoint),即使用本机IPEndPoint创建TcpClient的实例。其中IPEndPoint将网络端点表示为IP地址和端口号,用于指定在建立远程主机连接时所使用的本地网络接口IP地址和端口号。 (4)TcpClient (String, Int32),初始化 TcpClient 类的新实例并连接到指定主机上的指定端口。 因此,在TcpClient的构造函数中,如果没有指定远程主机名和端口号,它只是用来实例化TcpClient,同时实现与本地IP地址和Port

10、端口的绑定。,6.2 .NET中的TCP编程基础,6.2.1 TcpClient类 2与远程主机建立连接 如果在TcpClient的实例化过程中没有实现与远程主机的连接,则可以通过Connect方法来实现与指定远程主机的连接。Connect方法使用指定的主机名和端口号将客户端连接到远程主机,其使用方法如下。 (1)Connect(IPEndPoint),使用指定的远程网络终结点将客户端连接到远程TCP主机。 (2)Connect(IPAddress),使用指定的IP地址和端口号将客户端连接到远程TCP主机。 (3)Connect (IPAddress,Int32),使用指定的IP地址和端口号将

11、客户端连接到远程TCP主机。 (4)Connect(String, Int32),使用指定的主机名和端口号将客户端连接到指定主机上的指定端口。 如下代码段描述了TcpClient实例的创建以及与指定远程主机的连接过程。 m_client = new TcpClient( ); m_client.Connect(m_servername, m_port);,6.2 .NET中的TCP编程基础,6.2.1 TcpClient类 3利用NetworkStream实例发送和接收数据 TcpClient类创建在Socket之上,提供了更高层次的TCP服务抽象,特别是在网络数据的发送和接收方面,TcpCl

12、ient使用标准的Stream流处理技术,通过使用NetworkStream实例的读写操作来实现网络数据的接收和发送,因此更加方便直观。但NetworkStream与普通流Stream有所不同,NetworkStream没有当前位置的概念,不支持查找和对数据流的随机访问。 该方法首先通过TcpClient.GetStream来返回NetworkStream实例,进而利用所获取的NetworkStream实例的读写方法Write和Read来发送和接收数据,其实现代码如下所示。 rs = new StreamReader(m_client.GetStream( );/获取接收数据的网络流实例 ws

13、 = m_client.GetStream( ); /获取发送数据的网络流实例 m_returnData = rs.ReadLine( ); /接收网络数据 Console.WriteLine(m_returnData); ws.Write(data, 0, data.Length); /向网络发送数据 4关闭TCP套接字 在与服务器完成通信后,应该调用Close( )方法释放所有的资源。 m_client.Close( );,6.2 .NET中的TCP编程基础,6.2.2 TcpListener类 TcpClient类实现了客户端编程抽象,因此构建客户端网络应用程序便可以直接使用TcpCli

14、ent取代Socket,更加方便易用。同样,对于服务器端应用程序的构建,C#提供了TcpListener类。该类也是构建于Socket之上,提供了更高抽象级别的TCP服务,使得程序员能更方便地编写服务器端应用程序。TcpListener类的常见属性和方法分别如表6.3、表6.4所示。,6.2 .NET中的TCP编程基础,6.2.2 TcpListener类,6.2 .NET中的TCP编程基础,6.2.2 TcpListener类 通常情况下,服务器端应用程序在启动时将首先绑定本地网络接口的IP地址和端口号,然后进入侦听客户请求的状态,以便于客户端应用程序提出显式请求。一旦侦听到有客户端应用程序

15、请求连接侦听端口,服务器端应用将接受请求,并建立一个负责与客户端应用程序通信的信道,即通过创建连接套接字与客户端应用程序建立连接,由连接套接字完成与客户端应用程序的数据传送操作,服务器端应用程序继续侦听更多的客户端连接请求。TcpListener通过实例创建过程完成与本地网络接口的绑定,并由所创建的实例调用Start方法启动侦听;当侦听到客户端应用程序的连接请求后,根据客户端应用程序的不同请求方式,可以通过AcceptTcpClient方法接受传入的连接请求并创建TcpClient实例以处理请求,或者通过AcceptSocket方法接受传入的连接请求并创建Socket实例以处理请求,并由所创建

16、的TcpClient实例或Socket实例完成与客户端应用程序的网络数据传输。最后,需要使用Stop关闭用于侦听传入连接的Socket,同时也必须关闭从AcceptSocket或AcceptTcpClient返回的任何实例,以释放相关资源。其实现流程如右图所示。,6.2 .NET中的TCP编程基础,6.2.2 TcpListener类 1创建TcpListener实例 TcpListener类提供了3种构造函数的重载形式来创建TcpListener实例。 (1)TcpListener(port); /指定本机端口 (2)public TcpListener(IPEndPoint) /指定本机终

17、结点 (3)public 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方法启动侦听,即该方法将调用TcpListener实例的基础Socke

18、t上的Listen方法,开始侦听客户的连接请求, 如: m_Listener.Start( ); 3接收连接请求 当侦听到有客户连接请求时,可以使用AcceptSocket或AcceptTcpClient接收任何当前在队列中挂起的连接请求。这两种方法分别返回一个Socket或TcpClient实例以接受客户的连接请求,如: TcpClient m_client = m_Listener.AcceptTcpClient( ); 通过返回的Socket或TcpClient实例来实现与提出连接请求的客户的单独网络数据传输。,6.2 .NET中的TCP编程基础,6.2.2 TcpListener类 4

19、收发数据 如果接收连接请求时返回的是Socket实例,则可以用Send和Receive方法实现与客户的通信。如果返回的是TcpClient实例,则可以通过对NetworkStream的读写来实现与客户的数据通信。由于服务器可以同时与多个客户建立连接并进行数据通信,因此往往会引入多线程技术,为每个客户的连接建立一个线程,在该线程中实现与客户的数据通信。如下代码所示。 /为每个客户连接创建并启动一个线程 TcpClient m_client = m_Listener.AcceptTcpClient( ); ClientHandle m_handle = new ClientHandle( ); m

20、_handle.ClientSocket = m_client; Thread m_clientthread = new Thread(new ThreadStart(m_handle.ResponseClient); m_clientthread.Start( );,6.2 .NET中的TCP编程基础,6.2.2 TcpListener类 /线程处理代码 public void ResponseClient( ) if (m_clientsocket != null) StreamReader rs = new StreamReader(m_clientsocket.GetStream( )

21、; NetworkStream ws = m_clientsocket.GetStream( ); while (true) /接收信息 m_returnData = rs.ReadLine( ); /回送信息 ws.Write(data, 0, data.Length); m_clientsocket.Close( ); 5关闭连接 与客户程序通信完成之后,最后一步是停止侦听套接字,此时可以调用TcpListener的Stop方法来实现。,6.3 基于TCP的编程实例,为了综合应用TcpListener和TcpClient实现网络应用程序的设计,本节设计了一个简单的询问时间和回应程序,即客户

22、端程序可以利用GETDATE命令询问服务器的当前时间,而对于除命令以外的数据,服务器则原样返回给客户端程序。客户端程序和服务器程序的交互流程如图6.3所示。 在实现中,为了能使服务器更好地响应多个客户的请求,服务器程序的设计采用了多线程技术,针对每个客户创建并启动一个线程与之通信。整个系统的类图如图6.4所示。,图6.3 客户端程序和服务器程序交互流程图 图6.4 系统类图,6.3 基于TCP的编程实例,6.3.1 服务器端编程 服务器程序的实现主要是基于TcpListener、TcpClient和多线程技术,利用TcpListener实例进行客户连接的侦听和接受客户连接请求,而通过多线程技术

23、为每个客户连接创建一个处理线程,完成与客户程序的通信。服务器程序运行所需的本机网络接口IP和侦听端口号都利用命令行参数获取。程序如下: using System; using System.Net; using System.IO; using System.Net.Sockets; using System.Threading; using System.Collections; using System.Text; namespace Server /客户连接处理,用来接收和发送网络数据 class ClientHandle private string m_usename; privat

24、e TcpClient m_clientsocket = null;/TcpClient实例 private string m_returnData, m_sendData;/接收和发送数据 byte data;/中间变量 public TcpClient ClientSocket /属性 get return m_clientsocket; set m_clientsocket = value; byte EncodingASCII(string buf)/将数据转换为ASCII byte data = Encoding.ASCII.GetBytes(buf + “rn“); return

25、data; ,6.3 基于TCP的编程实例,6.3.1 服务器端编程 public void ResponseClient( ) if (m_clientsocket != null) StreamReader rs = new StreamReader(m_clientsocket.GetStream( ); NetworkStream ws = m_clientsocket.GetStream( ); /获取用户名 m_returnData = rs.ReadLine( ); m_usename = m_returnData;/保留用户名 m_sendData = “Welcome “ +

26、 m_returnData + “ to Server“; Console.WriteLine(m_sendData);/显示信息 /回送欢迎信息 data = EncodingASCII(m_sendData); ws.Write(data, 0, data.Length); while (true) /接收信息 m_returnData = rs.ReadLine( ); /解释所接收的信息 if (m_returnData.IndexOf(“QUIT“) -1) Console.WriteLine(m_usename+“ has quited!“);/显示退出信息 break; else

27、 if (m_returnData.IndexOf(“GETDATA“) -1) m_sendData = DateTime.Now.ToString( ); /回送当前时间 else m_sendData = “+m_returnData; /回送所接收的信息 /回送信息 data = EncodingASCII(m_sendData); ws.Write(data, 0, data.Length); m_clientsocket.Close( ); ,6.3 基于TCP的编程实例,6.3.1 服务器端编程 class Server static void Main(string args)

28、 string m_serverIP = “172.0.0.1“; int m_port = 5555; bool rt = false; TcpListener m_Listener = null; IPAddress m_host; if (args.Length 2) Console.WriteLine(“Usage: Server ServerIP Port“); else try m_serverIP = args0.ToString( ); m_port = int.Parse(args1.ToString( ); rt = true; catch (Exception e) Co

29、nsole.WriteLine(“Parametre Error:“ + e.Message); ,6.3 基于TCP的编程实例,6.3.1 服务器端编程 if (rt) try m_host = IPAddress.Parse(m_serverIP); m_Listener = new TcpListener(m_host, m_port); m_Listener.Start( ); Console.WriteLine(“Starting to listen“); while (true) TcpClient m_client = m_Listener.AcceptTcpClient( );

30、 ClientHandle m_handle = new ClientHandle( ); m_handle.ClientSocket = m_client; Thread m_clientthread=new Thread(new ThreadStart(m_handle.Response Client); m_clientthread.Start( ); m_Listener.Stop( ); catch (Exception e) Console.WriteLine(“Exception:“+e.Message); ,6.3 基于TCP的编程实例,6.3.2 客户端编程 客户程序负责向服

31、务器发送询问时间命令GETDATE、退出命令QUIT和其他数据信息。它运行所需的参数,包括用户名、服务器地址和服务器侦听端口号都是通过命令行参数获取。实现过程如代码实例6.2所示。 using System; using System.Net; using System.IO; using System.Net.Sockets; using System.Text; namespace Client /客户类 class Client static byte EncodingASCII(string buf) /将数据转换为ASCII byte data = Encoding.ASCII.Ge

32、tBytes(buf + “rn“); return data; static void Main(string args) string m_servername=“127.0.0.1“,m_usename=“NoName“; int m_port=5555; TcpClient m_client; bool rt = false; string m_sendData, m_returnData; byte data; StreamReader rs; NetworkStream ws;,6.3 基于TCP的编程实例,6.3.2 客户端编程 if (args.Length 3) Consol

33、e.WriteLine(“Usage: Client Usename ServerName Port“); else try /获取命令行参数 m_usename = args0.ToString( ); m_servername = args1.ToString( ); m_port = int.Parse(args2.ToString( ); rt = true; catch(Exception e) Console.WriteLine(“Parametre Error:“+e.Message); if (rt) try /创建TcpClient实例,并向服务器提出连接请求 m_clien

34、t = new TcpClient( ); m_client.Connect(m_servername, m_port); rs = new StreamReader(m_client.GetStream( ); ws = m_client.GetStream( ); /发送用户名 m_sendData = m_usename; data = EncodingASCII(m_sendData); ws.Write(data, 0, data.Length);,6.3 基于TCP的编程实例,6.3.2 客户端编程 while (true) /获取返回信息并显示 m_returnData = rs

35、.ReadLine( ); Console.WriteLine(m_returnData); /发送命令或其他信息 Console.WriteLine(“Input dataGETDATE|QUIT|Other:“); m_sendData = Console.ReadLine( ); if (m_sendData.IndexOf(“QUIT“) -1)/退出 m_sendData = “QUIT“; else if (m_sendData.IndexOf(“GETDATE“) -1)/询问时间命令 m_sendData = “GETDATE“; data = EncodingASCII(m_

36、sendData); ws.Write(data, 0, data.Length);/发送数据 if (m_sendData.IndexOf(“QUIT“) -1) break; m_client.Close( ); catch (Exception e) Console.WriteLine(“Exception:“+e.Message); ,6.4 .NET中的UDP编程基础,在.NET中,基于UDP协议的网络程序设计可以通过以下4种方法来实现。 Winsock API Winsock非托管API Socket类 UdpClient类 前面两种都是直接利用操作系统或第三方提供的网络编程API

37、实现,这要求编程人员必须对网络编程的底层知识有较好的了解。而Socket类实质上是Winsock API的一个包装器,使用Socket类进行网络程序设计与直接使用Winsock API类似。UdpClient类是基于Socket类的较高级别抽象,提供了较高级别的UDP服务。较前面三种方法具有直观易用等优势。因此,在.NET环境中基于UDP协议的网络程序设计可以直接用UdpClient类。 6.4.1 UdpClient类 与TcpClient和TcpListener类似,UdpClient也是构建于Socket类之上,提供了更高层次的UDP服务抽象,用于在阻止同步模式下发送和接收无连接 UDP

38、 数据报,使用简单直观。UdpClient类的常见方法和属性分别如表6.5、表6.6所示。,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类 基于UdpClient的网络应用编程首先需要创建一个UdpClient类实例,接着通过调用其Connect方法连接到远程主机。当然,这两步也可以直接由指定远程主机名和端口号的UdpClient类构造函数完成。然后便可以利用Send和Receive方法来发送和接收数据。最后调用Close方法关闭UDP连接,并释放相关资源。其实现流程如图6.5所示。,图6.5 基于Ud

39、pClient的编程流程,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类 1创建UdpClient实例 UdpClient提供了 3种构造函数的重载方式来创建UdpClient实例,根据传入参数的不同完成不同的创建形式,如下所述。 UdpClient ( ),以缺省方式初始化UdpClient的新实例,IP地址和端口号皆由系统自动指定。 UdpClient (AddressFamily),以指定的地址族初始化UdpClient的新实例。 UdpClient (Int32),以指定的端口号初始化UdpClient的新实例。 UdpClient (IPEndPoint),以指

40、定的本地终结点初始化UdpClient类的新实例。 UdpClient (Int32, AddressFamily),以指定的端口号和地址族初始化UdpClient的新实例。 UdpClient (String, Int32),以指定的远程主机名和端口号初始化UdpClient的新实例,并建立默认远程主机。 其中,UdpClient (String, Int32)重载形式在完成UdpClient实例初始化的同时也完成了远程主机连接信息的指定。 2指定连接信息 因为UDP是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但可以选择使用下面两种方法之一来指定默认远程主机: 使用远程主

41、机名和端口号作为参数创建UdpClient类的实例。 创建UdpClient类的实例,然后调用Connect方法。,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类 如果在创建UdpClient实例时没有指定远程主机信息,那么可以在发送数据前通过UdpClient的Connect方法先指定远程主机的地址和端口号,即指定连接信息。但是如果只需要接收数据,则不需要进行指定连接的操作。 对于连接信息的指定,主要包括三种方式,即直接在UdpClient的构造函数中指定,通过调用Connect方法指定和直接在Send方法中指定。而Connect方法又有三种重载形式,如下: UdpCl

42、ient.Connect (IPEndPoint),使用指定的远程主机信息建立默认远程主机。 UdpClient.Connect (IPAddress, Int32),使用指定的IP地址和端口号建立默认远程主机。 UdpClient.Connect (String, Int32),使用指定的主机名和端口号建立默认远程主机。 下面的代码段实现了UdpClient实例创建和连接信息指定操作。 IPAddress m_ipA = IPAddress.Parse(m_hostIP); m_EndPoint = new IPEndPoint(m_ipA, m_port); m_client = new

43、UdpClient( ); /创建UdpClient实例 m_client.Connect(m_EndPoint); /指定连接信息 3数据发送和接收 UdpClient实例创建后便可以进行数据发送和接收操作,如图6.5所示。UdpClient中提供了Send方法来完成数据发送操作,其重载形式有如下三种。,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类 UdpClient.Send (Byte, Int32),将UDP数据报发送到默认的远程主机。 UdpClient.Send (Byte, Int32, IPEndPoint),将UDP数据报发送到位于指定远程终结点的主机

44、。 UdpClient.Send (Byte, Int32, String, Int32),将UDP数据报发送到指定的远程主机上的指定端口。 因此,数据发送操作既可以在先指定连接信息的情况下给出发送数据及其长度进行发送,也可以由Send方法来指定远程主机的端口信息以及发送数据和长度进行发送。如下所示。 m_client.Send(data, data.Length);/在指定了连接信息后,直接给出数据及其长度进行发送 在UdpClient中提供了Receive方法来完成数据的接收操作,其申明形式如下: byte Receive ( ref IPEndPoint remoteEP )。 在接收缓

45、冲区没有数据时,Receive 方法将阻止,直到数据报从远程主机到达为止。如果数据可用,则Receive方法将读取接收缓冲区的第一个数据报,并将数据部分作为字节数组返回。在返回数据的同时使用发送方的IPAddress和端口号来填充remoteEP参数。 如果在Connect方法中指定了默认的远程主机,则Receive方法将只接收来自该主机的数据报,其他所有数据报将被丢弃。因此,如果需要接收多播数据报,则在调用Receive方法之前不能利用Connect方法来指定连接信息,并且必须使用多播端口号来创建用于接收数据报的UdpClient。下面程序段实现了对远程主机所发送信息的接收操作。,6.4 .

46、NET中的UDP编程基础,6.4.1 UdpClient类 IPEndPoint m_EndPoint; byte data; data = m_client.Receive(ref m_EndPoint);/接收数据,同时远程主机信息返回给m_EndPoint 4关闭连接 使用UdpClient的最后一步是关闭连接,可以直接调用UdpClient的Close方法来实现。 6.4.2 基于UdpClient类的编程实例 在本节中设计了一个简单的群组讨论工具,即参加讨论者可以利用UDPClient客户端程序加入讨论群组,也可以随时退出群组。当参加者加入讨论群组后,便可以向该群组发表自己的意见,服

47、务器程序UDPServer会将任何一位参加者所发表的意见转发给群组中的各位参加者,如图6.6所示。 在实现中,系统设计了三个类,其中客户端程序包括UDPClient类,服务器程序包括UDPServer类,而UDPComm类中实现了客户端程序和服务器程序所需要的共性操作。整个系统的类图如图6.7所示。 UDPComm、UDPClient和UDPServer类的详细实现分别如代码实例6.3、代码实例6.4和代码实例6.5所示。,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类,图6.6 客户端程序和服务器程序交互流程 图6.7 系统类图,6.4 .NET中的UDP编程基础,6.

48、4.1 UdpClient类,代码实例6.3 UDPComm类实现 using System; using System.Collections.Generic; using System.Text; namespace UDPComm public class UDPComm public static byte EncodingASCII(string buf) /编码 byte data = Encoding.ASCII.GetBytes(buf + “rn“); return data; public static string DecodingASCII(byte buf)/解码 string st = Encoding.ASCII.GetString(buf); return st; ,6.4 .NET中的UDP编程基础,6.4.1 UdpClient类,代码实例6.4 U

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1