C# UdpClient使用Receive和BeginReceive接收消息时的不同写法
使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, );
UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
while (true) //由于Receive方法是阻塞方法,一个Receive操作完了后才能继续往下执行,所以能在这里使用死循环
{
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
string msg = Encoding.UTF8.GetString(receiveBytes);
}
使用BeginReceive(异步)
private static void InitializeUdpClient()
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, );
UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
//如果这里写while(true) 则会不停挂起异步接收操作,直到占满缓冲区间或队列。会报“由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作”的错
UdpState s = new UdpState(udpClient, RemoteIpEndPoint);
udpClient.BeginReceive(EndReceive, s);
} private static void EndReceive(IAsyncResult ar)
{
try
{
UdpState s = ar.AsyncState as UdpState;
if (s != null)
{
UdpClient udpClient = s.UdpClient; IPEndPoint ip = s.IP;
Byte[] receiveBytes = udpClient.EndReceive(ar, ref ip);
string msg = Encoding.UTF8.GetString(receiveBytes); udpClient.BeginReceive(EndReceive, s);//在这里重新开始一个异步接收,用于处理下一个网络请求
}
}
catch (Exception ex)
{
//处理异常
}
} public class UdpState
{
private UdpClient udpclient = null; public UdpClient UdpClient
{
get { return udpclient; }
} private IPEndPoint ip; public IPEndPoint IP
{
get { return ip; }
} public UdpState(UdpClient udpclient, IPEndPoint ip)
{
this.udpclient = udpclient;
this.ip = ip;
}
}
文章转至网络
C# UdpClient使用Receive和BeginReceive接收消息时的不同写法的更多相关文章
- 【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数
(Azure Service Bus服务总线的两大类消息处理方式: 队列Queue和主题Topic) 问题描述 使用Service Bus作为企业消息代理,当有大量的数据堆积再Queue或Topic中 ...
- springboot整合mq接收消息队列
继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...
- 【Spring】使用Spring和AMQP发送接收消息(下)
上篇讲了使用RabbitMQ发送消息,本篇则来讲接收消息.在传统JMS中有两种从队列获取信息的方式,使用JmsTemplate的同步方式以及使用消息驱动pojo的异步方式.Spring AMQP也提供 ...
- ActiveMQ实例1--简单的发送和接收消息
一.环境准备 1,官网http://activemq.apache.org/下载最新版本的ActiveMQ,并解压 2,打开对应的目录,在Mac环境下,一般可以运行命令: cd /Users/***/ ...
- Kafka学习笔记(7)----Kafka使用Cosumer接收消息
1. 什么是KafkaConsumer? 应用程序使用KafkaConsul'le 「向Kafka 订阅主题,并从订阅的主题上接收消息.Kafka的消息读取不同于从其他消息系统读取数据,它涉及了一些独 ...
- 【原创】JMS生产者和消费者【PTP异步接收消息】
PTP模式下,异步接收消息需要定义一个MessageListener来监听,当生产者有消息要发送时会主动通知Listener去处理该消息,会调用监听的onMessage方法去处理. 首先看生产者(和同 ...
- RabbitMQ 入门 (Go) - 2. 发布和接收消息
本文我将使用 Go 语言在 RabbitMQ 上发布和接收消息. Go 的标准库本身并没有 RabbitMQ 的原生绑定,但是有一个第三方库确能够支持 RabbitMQ,它的源码在 https://g ...
- XMPP客户端开发(2)--发送接收消息
客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...
- [转] C#中发送消息给指定的窗口,以及接收消息
原文C#中发送消息给指定的窗口,以及接收消息 public class Note { //声明 API 函数 [DllImport("User32.dll", EntryPoint ...
随机推荐
- Sprint第三阶段(第四天12.12)
- CSS与JavaScript的一些问题汇总
通过最近的学习,总结了一些问题,可能总结得不够完善,但是好记性不如烂笔头,先记在这儿,后面看到更完整的回答,再进行修改. 1.事件流,如何阻止冒泡事件流:在点击一个按钮时,实则,按的父容器与按钮的父容 ...
- URi和Url格式
1.主要的区别 url一定是有scheme. uri不一定有scheme,可以是相对和绝对的.(相对是依赖环境的) 2.uri的结构(3种划分) 1)[scheme:]scheme-specific- ...
- IOS开发之GCD---dispatch_semaphore
信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待.当一个信号量被信号通知,其计数会被增加.当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零, ...
- layer弹出层全屏及关闭
一.首先引用JS文件 <script src="../../js/common/layer/layer.js"></script> 二.全屏调用以下代码 v ...
- java单例类/
java单例类 一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...
- 当shiro做成动态URL管理时出现循环注入BeanCurrentlyInCreationException的问题解决方法
<!-- Shiro的Web过滤器 --> <bean id="shiroFilter" class="org.apache.shiro.spring. ...
- [CentOS 7] 安装nginx
下载对应当前系统版本的nginx包(package) # wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-cent ...
- jquery实现可拖拽的div
由于项目中并未引入前端开发框架easyui.ext.没有现成的控件可以使用,今天时间算是充裕的时候,自己写了一个可以拖拽.放大缩小的例子.欢迎大家指正. 不啰嗦,上代码: 依赖的文件:jquery.j ...
- Codility Tree Height
public class HeightOfTreeSolution { static int height=-1; public int solution(Tree T) { // write you ...