手机版

在中的应用程序中在线共享UdpClient的实现方法 NET

时间:2021-11-20 来源:互联网 编辑:宝哥软件园 浏览:

源代码下载: mutualudpclientsample _ jb51net.rar(9500 . 163.com)。

为了提高数据传输的效率,在开发具有远程设备的通信系统时,经常选择通信协议UDP作为数据传输的媒介。中提供的UdpClient对象。NET框架可以帮助开发者根据系统需求打开UDP套接字点,快速建立UDP连接,提供与远程设备通信的功能。

在这种系统架构下,当添加不同类型的远程设备时,必须提供不同的UDP套接字点,以提供与不同类型的远程设备通信的功能。当远程设备种类越来越多时,系统所需的UDP套接字点会根据远程设备的类型而增加。

在远程设备种类越来越多的场景下,当系统与远程设备之间的通信为了网络管理而受到限制时,必须使用相同的UDP套接字点与远程设备进行通信,然后才能使用数据包内容或IP地址来判断实际连接的远程设备是什么。复制代码如下: class program { static void main(string[]args){//receiver UDP client UDP client a=new UDP client(new IP端点(IP地址。parse ('127.0.0.1 '),1234);UDP client UDP client TB=new UDP client(new IPEndPoint(IP address。Parse('127.0.0.1 '),1234);}}根据系统要求,开发者可以写出上面列出的程序代码,直接建立两个UdpClient对象打开同一个UDP套接字点。这个程序代码的内容是可以被编译器检查的,但是点击执行后,会在Visual Studio中看到SocketException的异常通知,用来通知开发者同一个套接字点只能打开一次,使用两个UdpClient是不可能打开同一个套接字点的。

参与跳过设计模式的开发人员在遇到资源对象只能有一个实体的情况时,会想到应用Singleton Pattern来提供共享资源对象的功能。系统中UdpClient对象打开的UDP套接字点属于这种只能由一个对象打开的资源。在这种情况下,将Singleton Pattern应用于UdpClient对象似乎是一个不错的选择。复制代码如下:classprogram {//singleton私有静态UDP client _ UDP client实例=null私有静态UDP client UDP client instance { get { if(_ UDP client instance==null){ _ UDP client instance=new UDP client(new IPEndPoint(IP address。Parse('127.0.0.1 '),1234);} return _ udpClientInstance} } //Main静态void Main(string[]args){//Receiver UDP client UDP clienta=Program。UdpClientInstanceUdpClient。UdpClientInstance//Transmiter UDP client Transmiter=new UDP client(new IPEndPoint(IP address。parse('(127 . 0 . 0 . 1 '),9999));//发送传输器。发送(新字节[] { 55 },1,新IPEndPoint(IPAddress。Parse('127.0.0.1 '),1234);//接收字节[]包=空;IPEndPoint remoteEndPoint=新的IPEndPoint(IPAddress。任何,IPEndPoint。MinPort);packet=udpClientA。接收(ref remote endpoint);控制台。WriteLine(字符串。格式(' UdpClientA Receive:{0} ',数据包[0]);packet=udpClientB。接收(ref remote endpoint);控制台。WriteLine(字符串。格式(' UdpClientB Receive:{0} ',数据包[0]);//结束控制台。ReadLine();//关闭变送器。close();udpClientB。close();udpClientA。close();}}将Singleton Pattern应用于系统中使用的UdpClient对象可以写出上面列出的程序代码。系统中使用的所有UdpClient对象都使用静态存储在系统中的共享UdpClient对象。这个程序代码的内容可以被编译器检查,执行过程中不会出现SocketException的异常通知,因为应用Singleton Pattern使得UDP套接字点在系统中只打开一次。但是,请以更高级的方式考虑UdpClient对象的数据包接收功能。UdpClient对象提供了一个接收方法来等待和接收远程设备发送的数据包。收到数据包后,再次执行接收方法将继续等待并接收下一个数据包。也就是说,远程设备发送的数据包,Receive方法只能获取一次,UdpClient对象在系统中是共享的,因此无法共享Receive方法获取的数据包。观察上述示例的执行结果,我们可以发现,示例中的发送方发送的数据包被UdpClientA通过receive方法接收后,UdpClientB无法接收到远程发送的数据包,这意味着在验证示例中将Singleton Pattern应用于系统中使用的UdpClientB时,数据包无法共享。

为了提供系统使用同一个UDP套接字点与远程设备通信的功能,然后根据数据包内容或IP地址判断实际连接的远程设备是什么。作者设计了一个名为MutualUdpClient的解决方案,用于共享UDP通信连接和系统中远程设备发送的数据包。

在MutualUdpClient的解决方案中,应用了上一篇博客中发布的Singleton Pool模式,让系统可以共享UdpClient连接,在部分系统对象使用UdpClient连接时打开共享UDP通信连接,而所有系统对象并不需要使用UdpClient连接就可以真正关闭共享UDP通信连接。

应用单例池模式解决了共享UdpClient连接的功能。然后,在MutualUdpClient的解决方案中,为了共享远程设备发送的数据包,在UDP客户端和MutualUdpClient之间添加了Route UdpClient对象。RouteUdpClient对象是一个活动对象。它建立后,会打开一个独立的线程,持续接收UdpClient收到的数据包,并通过事件通知每个MutualUdpClient收到的数据包。通过这个过程,远程设备发送的数据包可以在每个MutualUdpClient之间共享。另一方面,MutualUdpClient对象在接收RouteUdpClient提供的数据包时,会将数据包临时存储在队列中,在调用MutualUdpClient对象的Receive方法时,会将数据包从队列中取出发送回调用者,从而将远程设备发送的数据包提供给调用者进行后续处理。这样,在每个系统中创建的MutualUdpClient对象就可以通过Receive方法获得每个远程设备发送的数据包。*这里需要重点提到的是,MutualUdpClient对象使用Receive方法而不是event方法来提供数据包,这样使用MutualUdpClient对象的开发人员在使用该对象时可以获得与使用UdpClient相同的开发体验,从而减少开发过程中的学习时间。

在处理完共享UdpClient连接和共享远程设备发送的数据包后,我们还应该处理向远程设备发送数据包的功能。在MutualUdpClient中,对向远程设备发送数据包没有特殊要求,所以直接使用UdpClient的send功能就可以完成向远程设备发送数据包的功能。复制代码如下: class program { static void main(string[]args){//receiver相互UDP客户端UDP clienta=new相互UDP客户端(new IP端点(IP地址。parse ('127.0.0.1 '),1234);MutualUdpClient udpClientB=new MutualUdpClient(new IPEndPoint(IP address。Parse('127.0.0.1 '),1234);//Transmiter UDP client Transmiter=new UDP client(new IPEndPoint(IP address。parse('(127 . 0 . 0 . 1 '),9999));//发送传输器。发送(新字节[] { 55 },1,新IPEndPoint(IPAddress。Parse('127.0.0.1 '),1234);//接收字节[]包=空;IPEndPoint remoteEndPoint=新的IPEndPoint(IPAddress。任何,IPEndPoint。MinPort);packet=udpClientA。接收(ref remote endpoint);控制台。WriteLine(字符串。格式(' UdpClientA Receive:{0} ',数据包[0]);packet=udpClientB。接收(ref remote endpoint);控制台。WriteLine(字符串。格式(' UdpClientB Receive:{0} ',数据包[0]);//结束控制台。ReadLine();//关闭变送器。close();udpClientB。close();udpClientA。close();}}上面的程序代码演示了如何在系统中使用MutualUdpClient对象。在示例中可以看到,在程序代码中直接建立了两个具有相同UDP端点的MutualUdpClient对象,没有SocketException的异常通知可以正常执行。当远程设备发送者发送的数据包被UdpClientA通过receive方法接收时,UdpClientB仍然可以通过Receive方法接收相同的数据,这验证了MutualUdpClient对象提供了共享通信连接和共享数据包的功能。

源代码下载: mutualudpclientsample _ jb51net.rar。

版权声明:在中的应用程序中在线共享UdpClient的实现方法 NET是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。