当前位置: 首页 > 编程日记 > 正文

基于C#的UDP协议的同步实现

一、摘要

总结基于C#的UDP协议的同步通信。

二、实验平台

Visual Studio 2010

三、实验原理

UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述。

四、实例

 4.1 采用socket实现UDP

  由于UDP是一种无连接的协议。因此,为了使服务器应用能够发送和接收UDP数据包,则需要做两件事情:
(1) 创建一个Socket对象;
(2) 将创建的套接字对象与本地IPEndPoint进行绑定。
  完成上述步骤后,那么创建的套接字就能够在IPEndPoint上接收流入的UDP数据包,或者将流出的UDP数据包发送到网络中
其他任意设备。使用UDP进行通信时,不需要连接。因为异地的主机之间没有建立连接,所以UDP不能使用标准的Send()和Receive()t套接字方法,而是使用两个其他的方法:SendTo()和ReceiveFrom()。

    SendTo()方法指定要发送的数据,和目标机器的IPEndPoint。该方法有多种不同的使用方法,可以根据具体的应用进行选择,但是至少要指定数据包和目标机器。如下:
    SendTo(byte[] data,EndPoint Remote)
    ReceiveFrom()方法同SendTo()方法类似,但是使用EndPoint对象声明的方式不一样。利用ref修饰,传递的不是一个EndPoint对象,而是将参数传递给一个EndPoint对象。

 

  UDP应用不是严格意义上的真正的服务器和客户机,而是平等的关系,即没有主与次的关系。为了简便起见,仍然把下面的这个应用叫做UDP服务器。

  服务器端代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;namespace UDP
{class Program{static void Main(string[] args){int recv;byte[] data = new byte[1024];//得到本机IP,设置TCP端口号         IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8001);Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//绑定网络地址
            newsock.Bind(ip);Console.WriteLine("This is a Server, host name is {0}", Dns.GetHostName());//等待客户机连接Console.WriteLine("Waiting for a client");//得到客户机IPIPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)(sender);recv = newsock.ReceiveFrom(data, ref Remote);Console.WriteLine("Message received from {0}: ", Remote.ToString());Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));//客户机连接成功后,发送信息string welcome = "你好 ! ";//字符串与字节数组相互转换data = Encoding.ASCII.GetBytes(welcome);//发送信息
            newsock.SendTo(data, data.Length, SocketFlags.None, Remote);while (true){data = new byte[1024];//发送接收信息recv = newsock.ReceiveFrom(data, ref Remote);Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));newsock.SendTo(data, recv, SocketFlags.None, Remote);}}}
}

  对于接收流入的UDP服务器程序来说,必须将程序与本地系统中指定的UDP端口进行绑定。这就可以通过使用合适的本地IP地址创建一个IPEndPoint对象,以及合适的UDP端口号。上述范例程序中的UDP服务器能够在端口8001从网络上接收任意流入的UDP数据包。

 

  UDP客户机程序与服务器程序非常类似。
  因为客户机不需要在指定的UDP端口等待流入的数据,因此,不使用Bind()方法,而是使用在数据发送时系统随机指定的一个UDP端口,而且使用同一个端口接收返回的消息。在开发产品时,要为客户机指定一套UDP端口,以便服务器和客户机程序使用相同的端口号。UDP客户机程序首先定义一个IPEndPoint,UDP服务器将发送数据包到这个IPEndPoint。如果在远程设备上运行UDP服务器程序,在IPEndPoint定义中必须输入适当的IP地址和UDP端口号信息。

  客户端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;namespace UDPClient
{class Program{static void Main(string[] args){byte[] data = new byte[1024];string input, stringData;//构建TCP 服务器Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());//设置服务IP,设置TCP端口号IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);//定义网络类型,数据连接类型和网络协议UDPSocket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);string welcome = "你好! ";data = Encoding.ASCII.GetBytes(welcome);server.SendTo(data, data.Length, SocketFlags.None, ip);IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)sender;data = new byte[1024];//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制int recv = server.ReceiveFrom(data, ref Remote);Console.WriteLine("Message received from {0}: ", Remote.ToString());Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));while (true){input = Console.ReadLine();if (input == "exit")break;server.SendTo(Encoding.ASCII.GetBytes(input), Remote);data = new byte[1024];recv = server.ReceiveFrom(data, ref Remote);stringData = Encoding.ASCII.GetString(data, 0, recv);Console.WriteLine(stringData);}Console.WriteLine("Stopping Client.");server.Close();}}
}

上述代码的实现逻辑为:相关设置完成后,服务器端先向客户端发送信息,之后客户端通过键盘发送字符串,服务器端收到后再发送给客户端,如此循环。

4.2 采用UDPClient类实现

服务器端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;public class Custom
{// 设置IP,IPV6private static readonly IPAddress GroupAddress = IPAddress.Parse("IP地址");// 设置端口private const int GroupPort = 11000;private static void StartListener(){bool done = false;UdpClient listener = new UdpClient();IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);try{//IPV6,组播
            listener.JoinMulticastGroup(GroupAddress);listener.Connect(groupEP);while (!done){Console.WriteLine("Waiting for broadcast");byte[] bytes = listener.Receive(ref groupEP);Console.WriteLine("Received broadcast from {0} :\n {1}\n", groupEP.ToString(), Encoding.ASCII.GetString(bytes, 0, bytes.Length));}listener.Close();}catch (Exception e){Console.WriteLine(e.ToString());}}public static int Main(String[] args){StartListener();return 0;}
}

客户端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;public class Client
{private static IPAddress GroupAddress = IPAddress.Parse("IP地址");private static int GroupPort = 11000;private static void Send(String message){UdpClient sender = new UdpClient();IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);try{Console.WriteLine("Sending datagram : {0}", message);byte[] bytes = Encoding.ASCII.GetBytes(message);sender.Send(bytes, bytes.Length, groupEP);sender.Close();}catch (Exception e){Console.WriteLine(e.ToString());}}public static int Main(String[] args){Send(args[0]);return 0;}
}

以上代码需要说明的是:

(1) 上述代码是基于IPV6地址的组播模式。IPv4中的广播(broadcast)可以导致网络性能的下降甚至广播风暴(broadcast storm)。在IPv6中就不存在广播这一概念了,取而代之的是组播(multicast)和任意播(anycast)。

(2) IPV6地址表示方法:

a) X:X:X:X:X:X:X:X(每个X代表16位的16进制数字),不区分大小写;

b) 排头的0可省略,比如09C0就可以写成9C0,0000可以写成0;

c) 连续为0的字段可以以::来代替,但是整个地址中::只能出现一次,比如FF01:0:0:0:0:0:0:1就可以简写成FF01::1。

(3) 如果是采用窗体的形式建议使用这种格式,否则在接收数据时可能会出现死机的现象。

// 创建一个子线程
Thread thread = new Thread(delegate(){try{//在这里写你的代码
                    }catch (Exception ){}});thread.Start();

转载于:https://www.cnblogs.com/sunev/archive/2012/08/08/2627247.html

相关文章:

【直播】杨剑砺:数据可视化漫谈

数据可视化漫谈 目前 安泰第四届数据科学训练营 正在如火如荼的进行中。为了大家更好的学习,杨剑砺将为大家带来一场直播分享 —— 数据可视化漫谈。 直播信息 主讲人:杨剑砺,Datawhale成员,外企数据分析师。 直播时间&#xf…

service 与chkconfig

需要把启动脚本放到/etc/init.d/里面,还要加权限chmod x mysqld 本文转自flayber 51CTO博客,原文链接:http://blog.51cto.com/406647516/1919335,如需转载请自行联系原作者

从事软件测试为什么要学自动化?

软件测试要学习的知识是有很多的,虽然听起来简单,但是细节知识还是很多的,尤其是软件测试自动化这块,那么就有人问了,从事软件测试为什么要学自动化?来看看下面的详细介绍就知道了。 从事软件测试为什么要学自动化?首…

【直播】黎佳佳:音频数据分析以及特征提取

音频数据分析以及特征提取 目前 Datawhale第24期组队学习 正在如火如荼的进行中。为了大家更好的学习“零基础入门语音识别(食物声音识别)”的课程设计者 黎佳佳,将为大家带来一场直播分享——音频数据分析以及特征提取。 直播信息 主讲人&…

电机相电压重构

利用svpwm的输出和当前的直流母线电压,计算出相电压参考TI文档phase_volt_calc.pdf注:该文章未考虑死区和管压降的影响 转载于:https://www.cnblogs.com/iable/archive/2012/08/08/4206882.html

ui设计的文字怎样提高设计感呢?

相信很多做UI设计师的小伙伴们,在工作的时候经常会遇到一些瓶颈,例如设计的构思,文字的改动都是让人头疼的事情,下面小编本期就为大家分享一个ui设计的文字怎样提高设计感。 UI设计培训分享:ui设计的文字怎样提高设计感…

SSL之CA证书颁发机构安装图文详解

上一节我们说到,在验证公钥安全性时,是在CA机构颁发的包含用户的公钥及其身份信息的数字证书,数字证书由权威机构——CA签发。这个CA权威机构可以是自己的服务器也可以是国际公认的CA权威机构。下面我就来讲一下CA证书颁发机构 如果你需要在组织里发布ex…

【组队学习】【24期】零基础入门语音识别(食物声音识别)

零基础入门语音识别(食物声音识别) 开源内容: https://github.com/datawhalechina/team-learning-nlp/tree/master/FoodVoiceRecognition 比赛地址: https://tianchi.aliyun.com/competition/entrance/531887/introduction 基…

同时使用多网卡提升树莓派网络利用率

树莓派 3 自带的有线网卡是 100M 的,无线网卡是 72M 的,都比较慢。想提升网速的话,最直接的方法是使用 usb 网卡,千兆的有线网卡或者 450M 以上的 2.4GHz 无线网卡或者 5GHz 无线网卡。但因为树莓派 3 的 usb 接口是 2.0 的&#…

Python培训基础教程都教哪些

根据相关数据统计,目前学习Python技术的同学大多数是零基础,都是从其他行业转型来学习的,那么Python培训基础教程都教哪些呢?好不好学呢?来看看下面的详细介绍。 Python培训基础教程都教哪些? 1、面向对象 类和对象、类的定义格式、添加和…

sqlce wp from查询语句详解

http://msdn.microsoft.com/zh-cn/library/bb383978(vvs.110).aspx from 子句(C# 参考) Visual Studio 2012其他版本此主题尚未评级 - 评价此主题[本文档仅供预览,在以后的发行版中可能会发生更改。包含的空白主题用作占位符。] 查询表达式必…

【直播】王茂霖:二手车交易价格预测-千变万化特征工程(河北高校数据挖掘邀请赛)

二手车交易价格预测-千变万化特征工程 目前 河北高校数据挖掘邀请赛 正在如火如荼的进行中。为了大家更好的参赛,王茂霖分享了 从0梳理1场数据挖掘赛事!,完整梳理了从环境准备、数据读取、数据分析、特征工程到数据建模的整个过程。04月20日晚…

微软在C# 8中引入预览版可空引用类型

微软已经为开发者提供了预览版的可空引用类型(Nullable Reference Type),想尝鲜的开发者可以尝试这个新特性,并提供反馈。\\预览版可空引用类型是Visual Studio 2017 15.5 Preview 4的Roslyn扩展,现在支持.NET框架&…

制作ui设计作品集要注意哪些

UI设计作品集的作用是非常大的,不要小看,它可以用来展示自身的UI设计实力,参加完UI设计培训后找工作当然也是非常重要的一个环节,下面小编就为大家详细的介绍一下制作ui设计作品集要注意哪些问题? UI设计培训分享:制作…

[转] 理解RESTful架构

FROM:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高…

【直播】陈安东,但扬:CNN模型搭建、训练以及LSTM模型思路详解

CNN模型搭建、训练以及LSTM模型思路详解 目前 Datawhale第24期组队学习 正在如火如荼的进行中。为了大家更好的学习“零基础入门语音识别(食物声音识别)”的课程设计者 陈安东和但扬杰,将为大家带来一场直播分享 —— CNN模型搭建、训练以及L…

参加Java培训需要注意哪些

想要学好java技术,靠自学是非常困难的,通过java培训机构进行系统的学习是最好的,那么参加Java培训需要注意哪些呢?来看看下面的详细介绍。 参加Java培训需要注意哪些?大概整理了下面几点。 1、要有与时俱进且完整沉浸的课程体系。 IT培训的…

JDBC操作MySQL Lob字段记实

JDBC操作MySQL Lob字段记实虽然Java的持久化框架多如牛毛,但都离不开JDBC技术,JDBC在某些时候是其他框架难以取代的。也是java操作数据库最根本的技术。上文写了JDBC操作DB2 Lob字段bug问题,为此,我还特意写了MySQL平台下的Lob字段…

placeholder

打开一个那边发过来的页面,里面全是placeholder。没见过,一时气愤全部ko,用传统的方法都能搞定的东西,为啥要标新立异! 后来发现如果想在input password里显示个把汉字,还真是不容易,总不能让我…

【直播】李祖贤:集成学习答疑直播之五 -- 常用集成思路

集成学习答疑直播之五 – 常用集成思路 集成学习 是首个横跨3个周期的长期组队学习,在 第24期组队学习 中进行到“第二期-模型集成思路”阶段。组队学习期间,课程设计者每周针对学习任务的重难点和学员的学习情况进行集中直播答疑,目前已经进…

参加Python培训班能找到工作吗?

参加Python培训班能找到工作吗?很多人都比较关心这个问题,尤其是正在参加Python培训的同学,想要了解这个问题,我们必须从Python就业市场、Python就业班优劣以及个人学习效果三个大的方面进行分析。来看看下面的详细介绍。 参加Python培训班能…

HTTP协议Etag详解

HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTT…

【第13周复盘】小朋友们也开始卷了

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

原生ajax+php上传图片的简单实现

前端 <input type"file" onclick"updown" accept"image/png,image/gif">//accept限制上传的类型<script> function upload1(obj){ var files obj.files ; var formData new FormData();$.ajax({url: download.php,type: "POS…

参加软件测试培训前景怎么样

软件测试在近几年的发展前景还是非常不错的&#xff0c;很多人都开始参加软件测试培训班学习技术&#xff0c;要想具体了解参加软件测试培训前景怎么样?来看看下面的详细介绍就知道了。 参加软件测试培训前景怎么样?各大招聘平台上&#xff0c;都能看到测试的影子&#xff0c…

如果你喜欢一个程序员小伙

程序员向来是善于幽默自嘲的群体&#xff0c;但从某种程度上影响了咱程序员在广大女同胞心中的印象啊&#xff5e;&#xff5e;于是写下此篇&#xff08;有从别处看到的3句加进来的&#xff09;&#xff0c; 就算是为咱程序员做个广告&#xff5e;&#xff5e;要是觉得有点过的…

遇到大容量磁盘你该怎么办?

GPT 磁盘分区&#xff1a;首先&#xff0c;你得有一块 GPT 分区的硬盘。小于 2 TB 的磁盘也可以转为 MBR 磁盘&#xff0c;但是大于 2 TB 的磁盘则需要使用 GPT 分区&#xff0c;否则大于 2 TB 的部分将被你封印。 挂载硬盘后&#xff0c;打开系统并以 root 身份登陆。这里博主…

如何解决Python3写入CSV出现‘gbk‘ codec can‘t encode的错误

今天&#xff0c;我在 Windows 上用 Python3 爬取知乎上有关中医的问答&#xff0c;但是在把爬取的内容写进CSV文件的时候&#xff0c;出现了以下异常。 UnicodeEncodeError: gbk codec cant encode character \u2630 in position 3969: illegal multibyte sequence经过上网查…

ui设计怎样做出有效果的视觉层级?

作为一名UI设计师&#xff0c;大家应该清楚的了解到每一款产品都有不同的风格和设计&#xff0c;但是每一款UI设计元素都是有通风之处的&#xff0c;如何能够做出有效的视觉层级&#xff0c;对用户的体验有着十分积极的影响。本期UI设计培训教程就为大家详细的介绍一下ui设计怎…

Java RandomAccessFile的使用

Java的RandomAccessFile提供对文件的读写功能&#xff0c;与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。 RandomAccessFile的对象包含一个记录指针&#xff0c;用于标识当前流的读写位置&#xff0c;这个位置可以向…