第4章 UDP网络程序的开发_第1页
第4章 UDP网络程序的开发_第2页
第4章 UDP网络程序的开发_第3页
第4章 UDP网络程序的开发_第4页
第4章 UDP网络程序的开发_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章UDP网络程序的开发4.1UDP程序开发的主要技术

4.2UDP的广播与组播程序的开发

4.3基于广播和组播的网络会议程序的开发

本章教学主要内容4.1UDP程序开发的主要技术

4.1.1UDP与TCP的区别与优势

4.1.2

使用UDP类进行网络传输

4.1.3UDP下的同步与异步通讯

4.1

UDP与TCP的区别与优势1.UDP的可靠性不如TCP2.UDP不能保证有序传输3.UDP拥有比TCP更快的传输速度4.UDP有消息边界5.UDP可以一对多传输4.1.2UDP的广播与组建程序的开发UdpClient类

(1)TCP有TcpListener和TcpClient两个类,而UDP只有UdpClient这一个类,这是因为UDP是无连接的协议,所以只需要一种封装后的Socket。(2)UdpClient拥有6种重载的构造函数,对于IPV4来说,常用的重载形式有4种:4.1.2UDP的广播与组建程序的开发1)PublicUdpClient()

此构造函数创建一个新的UdpClient对象,并自动分配合适的本地Ipv4地址和端口号,但是该构造函数不执行套接字绑定。如果使用这种构造函数,在发送数据报之前,必须先调用Connect方法,而且只能将数据报发送到Connect方法建立的远程主机。用法如下:

UdpClientudpClient=newUdpClient();udpClient.Connect(“”,51666);//指定默认远程主机和端口号Byte[]sendBytes=Encoding.Unicode.GetBytes(“你好!”);udpClient.Send(sendBytes,sendBytes.Length);//发送给默认主机4.1.2UDP的广播与组建程序的开发

2)publicUdpClient(intport);

如果创建UdpClient对象只是为了发送数据报,则可以用此构造函数用法如下:UdpClientsendUdpClient=newUdpClient(0);

端口号置为0,表示让系统自动的为其分配一个合适的端口号,这样就不会发生端口号冲突的情况,因此这种形式是创建UdpClient对象最方便简单的方式。4.1.2UDP的广播与组建程序的开发3)publicUdpClient(IpEndPointlocalEp);

如果创建UdpClient对象是用来接收远程主机发送到本地主机某个端口的数据报,则使用此构造函数比较合适。用法如下:IPAddresslocalIp=Dns.GetHostAddress(Dns.GetHostName())[0];IPEndPointlocalIPEndPoint=newIPEndPoint(localIp,51666);UdpClientudpClient=newUdpClient(localIPEndPoint);

其中,localIPEndPoint是一个IPEndPoint(网络端点)类型的对象实例,封装了本机的一个确定的端口号。这样一来,只要远程主机知道本地主机的IP地址,就可以直接向本机的指定端口发送数据报。4.1.2UDP的广播与组建程序的开发4)publicUdpClient(stringhostname,intport)

此构造函数创建一个新的UdpClient实例,并自动分配合适的本地Ipv4地址和端口号,用于收发数据。用法如下:

UdpClientudpClient=newUdpClient(“”,51666);

这种构造函数适用于向默认主机发送数据,或者只接收默认远程主机发来的数据,而其他主机发送来的数据报自动丢弃的场合。4.1.2UDP的广播与组建程序的开发UdpClient类常用的方法

4.1.3UDP下的同步于异步通信1.同步通讯。

同步发送数据时,可以调用UdpClient对象的Send方法。该方法有3种不同的重载形式,如下:1)PublicintSend(byte[]data,intlength,IPEndPointiep)

该方法将UDP数据报发送到位于指定远程端点的主机。它的三个参数分别为:发送的数据,希望发送的字节数,远程IPEndPoint对象,返回值为成功发送的字节数。用法如下:4.1.3UDP下的同步于异步通信privateUdpClientsendUdpClient;IPAddressremoteIp=Dns.GetHostAddress(Dns.GetHostName())[0];IPEndPointremoteIPEndPoint=newIPEndPoint(remoteIp,51666);byte[]sendbytes=Encoding.Unicode.GetBytes(“你好!”);UdpClient.Send(sendBytes,sendBytes.length,remoteIPEndPoint);4.1.3UDP下的同步于异步通信2)PublicintSend(byte[]data,intlength,stringhostname,intport)。

该方法将UDP数据报发送到指定远程主机上的指定端口。它的四个参数分别为:发送的数据,希望发送的字节数,远程主机名称,远程主机端口号,返回值为成功发送的字节数。用法如下:

UdpClientudpClient=newUdpClient();

byte[]sendbytes=Encoding.Unicode.GetBytes(“hello!”);udpClient.Send(sendBytes,sendBytes.Length,””,51666);4.1.3UDP下的同步于异步通信3)PublicintSend(byte[]data,intlength)该方法假定已经通过Connect方法指定了远程主机,因此只需要用Send方法指定发送的数据和希望发送的字节数即可,返回值为成功发送的字节数。用法如下:

UdpClientudpClient=newUdpClient(“”,51666);

byte[]sendbytes=Encoding.Unicode.GetBytes(“hello!”);

udpClient.Send(sendBytes,sendBytes.Length);4.1.3UDP下的同步于异步通信同步接收数据

我们可以用UDP的Receive方法来获取接收远程主机发过来的数据报。例如:

Publicbyte[]Receive(refIPEndPointremoteEP)

其中唯一的参数IPEndPoint表示发送方的IP地址和端口号。4.1.3UDP下的同步于异步通信1.异步通讯。

异步发送数据。

UdpClient类的每个同步方法,都有与之对应的异步BeginSend和EndSend方法。所以异步通讯的BeginSend方法也有3种不同的重载形式,如下:

1)PublicintBeginSend(byte[]data,intlength,IPEndPointiep,

AsyncCallback

ac,Objectobj)。 2)PublicintBeginSend(byte[]data,intlength,string

hostname,intport,AsyncCallbackac,Objectobj)。 3)PublicintBeginSend(byte[]data,intlength,

AsyncCallbackac,Objectobj)。4.1.3UDP下的同步于异步通信对比同步通讯可以看出,对于每个BeginSend方法,在除了与同步Send方法具有相同的参数外,每个方法又增加了两个参数,一个是AsyncCallback类型的委托,用于指定异步操作完成时调用的方法。另一个是Object类型的对象,用于将状态信息传递给回调方法。当不使用的时候,这两个新增的参数都可以置为null。下面以最常用的

BeginSend(byte[]data,intlength,IPEndPointiep,AsyncCallback

ac,Objectobj)为例,说明如何异步发送数据。4.1.3UDP下的同步于异步通信StaticvoidSendMessage(stringserver,stringmessage){

UdpClientudpClient=newUdpClient(server,51666);

byte[]sendByte=Encoding.Unicode.GetBytes(“hello!”);

//异步方式发送数据

IAsyncResultresult=

udpClient.BeginSend(sendByte,sendByte.length,null,null);

//在发送没有结束之前可以做一些其他的操作,这里Thread.Sleep(100)代替 while(!result.IsCompleted) {

Thread.Sleep(100); }intsendbytes=udpClient.EndSend(result);//EndSend方法进行资源回收}

需要注意的是,在调用了BeginSend方法后,必须要调用UdpClient对象的EndSend方法,本例中,返回了实际发送的字节数,并进行资源回收。4.1.3UDP下的同步于异步通信异步接收数据

异步接收数据将用到与同步接受数据时所用的Receive方法相对应的BeginReceive方法。形式如下:

PublicIAsyncResultBeginReceive(AsyncCallbackrequestCallback,Objectstate);下面将以此为例说明如何运行此方法。

PrivatevoidReceiveData(){

UdpClientreceiveClient=newUdpClient(5656);//指定本机5656端口号用于接收。

receiveClient.BeginReceive(newAsyncCallback(ReceiveUdpClientCallback),receiveClient);}4.1.3UDP下的同步于异步通信

//回调方法

VoidReceiveUdpClient(IAsyncResultar)

{

UdpClientu=(UdpClient)ar.AsyncSate;

IPEndPointremote=null;

Byte[]receiveBytes=u.EndReceive(ar,refremote);

String

str=Encoding.UF8.GeString(receiveBytes,0,receiveBytes.Length); }4.2UDP的广播与组播程序的开发

4.2.1

广播与组播的基本概念

4.2.2组播组的加入与退出4.2.1广播与组播的基本概念广播的定义:指同时向子网中的所有主机发送信息。为了能让所有的主机都能收到信息,发送的广播消息必须包含一个特殊的IP地址,这个IP地址的主机号的二进制表现形式全为1。例如,子网掩码为,则对于子网192.168.0,这个特殊的IP地址为55。又或对于B类网络,使用子网掩码,则本地广播地址为55。广播消息地址分为两种类型,本地广播和全球广播。4.2.1广播与组播的基本概念对于Ipv4来说,全球广播使用所有位为1的IP地址,这个特定的广播地址表明数据报的目的是网络上的所有设备。但是由于路由器会自动过滤掉全球广播,所以使用这个地址没有实际意义。组播的定义: 当接收者分布于多个不同的子网内时,广播将不再适用。此时可以用组播来实现。组播也叫多路广播。所谓组播是将消息从一台电脑发送到本网或全网内选择的计算机子集上,即发送到那些加入指定组播组的计算机上。组播组是开放的,每台计算机都可以通过程序随时加入和离开组播组。4.2.2组播组的加入与退出1)加入多路广播组:用到方法JoinMulticastGroup。

JoinMulticastGroup方法有两种常用的重载形式。1.JoinMulticastGroup(IPAddressmulticastAddr)用法如下:

UdpClientudpClient=newUdpClient(8001);

udpClient.JoinMulticastGroup(IPAddress.Parse(“”));

多路广播地址的范围从到54,如果指定的地址在此范围之外,或者所请求的路由器不支持多路

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论