先看效果图

Server:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace AsyncServer
{
// 定义 UdpState类
public class UdpState
{
public UdpClient udpClient;
public IPEndPoint ipEndPoint;
public const int BufferSize = ;
public byte[] buffer = new byte[BufferSize];
public int counter = ;
}
// 异步UDP类
public class AsyncUdpSever
{
// 定义节点
private IPEndPoint ipEndPoint = null;
private IPEndPoint remoteEP = null;
// 定义UDP发送和接收
private UdpClient udpReceive = null;
private UdpClient udpSend = null;
// 定义端口
private const int listenPort = ;
private const int remotePort = ;
UdpState udpReceiveState = null;
UdpState udpSendState = null;
// 异步状态同步
private ManualResetEvent sendDone = new ManualResetEvent(false);
private ManualResetEvent receiveDone = new ManualResetEvent(false);
public AsyncUdpSever()
{
// 本机节点
ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);
// 远程节点
//remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);
// 实例化
remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), remotePort);
udpReceive = new UdpClient(ipEndPoint);
udpSend = new UdpClient(); // 分别实例化udpSendState、udpReceiveState
udpReceiveState = new UdpState();
udpReceiveState.udpClient = udpReceive;
udpReceiveState.ipEndPoint = ipEndPoint; udpSendState = new UdpState();
udpSendState.udpClient = udpSend;
udpSendState.ipEndPoint = remoteEP;
}
public void ReceiveMsg()
{
Console.WriteLine("监听中....");
while (true)
{
lock (this)
{
// 调用接收回调函数
IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);
receiveDone.WaitOne();
Thread.Sleep();
}
}
}
// 接收回调函数
private void ReceiveCallback(IAsyncResult iar)
{
UdpState udpReceiveState = iar.AsyncState as UdpState;
if (iar.IsCompleted)
{
Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);
string receiveString = Encoding.ASCII.GetString(receiveBytes);
Console.WriteLine("接受数据: {0}", receiveString);
//Thread.Sleep(100);
receiveDone.Set();
SendMsg();
}
}
// 发送函数
private void SendMsg()
{
udpSend.Connect(udpSendState.ipEndPoint);
udpSendState.udpClient = udpSend;
udpSendState.counter++; string message = string.Format("服务端:第{0}个UDP请求处理完成!", udpSendState.counter);
Byte[] sendBytes = Encoding.Unicode.GetBytes(message);
udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);
sendDone.WaitOne();
}
// 发送回调函数
private void SendCallback(IAsyncResult iar)
{
UdpState udpState = iar.AsyncState as UdpState;
Console.WriteLine("第{0}个请求处理完毕!", udpState.counter);
Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));
sendDone.Set();
}
// 主函数
public static void Main()
{
AsyncUdpSever aus = new AsyncUdpSever();
Thread t = new Thread(new ThreadStart(aus.ReceiveMsg));
t.Start();
Console.Read();
}
}
}

客户端:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace AsyncClient
{
// 定义 UdpState类
public class UdpState
{
public UdpClient udpClient = null;
public IPEndPoint ipEndPoint = null;
public const int BufferSize = ;
public byte[] buffer = new byte[BufferSize];
public int counter = ;
}
// 异步UDP类
public class AsyncUdpClient
{
public static bool messageSent = false;
// Receive a message and write it to the console.
// 定义端口
private const int listenPort = ;
private const int remotePort = ;
// 定义节点
private IPEndPoint localEP = null;
private IPEndPoint remoteEP = null;
// 定义UDP发送和接收
private UdpClient udpReceive = null;
private UdpClient udpSend = null;
private UdpState udpSendState = null;
private UdpState udpReceiveState = null;
private int counter = ;
// 异步状态同步
private ManualResetEvent sendDone = new ManualResetEvent(false);
private ManualResetEvent receiveDone = new ManualResetEvent(false);
// 定义套接字
//private Socket receiveSocket;
//private Socket sendSocket; public AsyncUdpClient()
{
// 本机节点
localEP = new IPEndPoint(IPAddress.Any, listenPort);
// 远程节点
remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), remotePort);
// 实例化
udpReceive = new UdpClient(localEP);
udpSend = new UdpClient(); // 分别实例化udpSendState、udpReceiveState
udpSendState = new UdpState();
udpSendState.ipEndPoint = remoteEP;
udpSendState.udpClient = udpSend; udpReceiveState = new UdpState();
udpReceiveState.ipEndPoint = remoteEP;
udpReceiveState.udpClient = udpReceive; //receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//receiveSocket.Bind(localEP); //sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//sendSocket.Bind(remoteEP);
}
// 发送函数
public void SendMsg()
{
udpSend.Connect(remoteEP); //Thread t = new Thread(new ThreadStart(ReceiveMessages));
//t.Start();
Byte[] sendBytes;
string message;
while (true)
{
message = "Client" + (counter++).ToString();
lock (this)
{
sendBytes = Encoding.ASCII.GetBytes(message);
udpSendState.counter = counter;
// 调用发送回调函数
udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);
sendDone.WaitOne();
Thread.Sleep();
ReceiveMessages();
}
}
} // 发送回调函数
public void SendCallback(IAsyncResult iar)
{
UdpState udpState = iar.AsyncState as UdpState;
if (iar.IsCompleted)
{
Console.WriteLine("客户端:第{0}个发送完毕!", udpState.counter);
Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));
//if (udpState.counter == 10)
//{
// udpState.udpClient.Close();
//}
sendDone.Set();
}
} // 接收函数
public void ReceiveMessages()
{
lock (this)
{
udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);
receiveDone.WaitOne();
Thread.Sleep();
}
} // 接收回调函数
public void ReceiveCallback(IAsyncResult iar)
{
UdpState udpState = iar.AsyncState as UdpState;
if (iar.IsCompleted)
{
Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);
string receiveString = Encoding.Unicode.GetString(receiveBytes);
Console.WriteLine("接受数据: {0}", receiveString);
receiveDone.Set();
}
} // 主函数
public static void Main()
{
AsyncUdpClient auc = new AsyncUdpClient();
auc.SendMsg();
Console.Read();
}
}
}

示例代码AsyncUDP

UDP异步通信的更多相关文章

  1. Udp 异步通信(三)

    转自:https://blog.csdn.net/zhujunxxxxx/article/details/44258719 1)服务端 using System; using System.Colle ...

  2. C#UDP异步通信

    using SetingDemo.LogHelp;using SetingDemo.SingleRowDeclare;using System;using System.Collections.Gen ...

  3. JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)

    Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...

  4. C# Socket编程 同步以及异步通信

    套接字简介:套接字最早是Unix的,window是借鉴过来的.TCP/IP协议族提供三种套接字:流式.数据报式.原始套接字.其中原始套接字允许对底层协议直接访问,一般用于检验新协议或者新设备问题,很少 ...

  5. C# HTTP1.0 1.1 2.0与HTTPS 、TCP/IP协议的UDP与TCP、 Socket介绍与WebSocket

    一.HTTP1.0 1.1 2.0和HTTPS 1.HTTP协议是什么? HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol.它是从WEB服务器传输超文 ...

  6. UDP协议,多道技术,进程,同步与异步,阻塞与非阻塞

    UDP协议 简介 UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程 中不保证数据的完整性! 端口号 UDP使用IP地址和端口号进行标识,以此将数据 ...

  7. Node.js:dgram模块实现UDP通信

    1.什么是UDP? 这里简单介绍下,UDP,即用户数据报协议,一种面向无连接的传输层协议,提供不可靠的消息传送服务.UDP协议使用端口号为不同的应用保留其各自的数据传输通道,这一点非常重要.与TCP相 ...

  8. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  9. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

随机推荐

  1. 针对“Can't download driver to specified address”错误

    当用h-flasher检测flash-id时,可能会出现上述错误,个人认为当提示这个错误时,一般来说是sdram出现了问题,可以看看sdram有没有虚焊,或者周围的电阻电容是否正确. 在后来调板子的过 ...

  2. centos,apache运维经验

    1.防止php木马在apache下跨站 在/etc/php.ini 中设置open_basedir=.:/tmp/  , (还需要加载网站所在的目录) 2.shell下搜索木马 find ./ -ty ...

  3. Eclipse导入Tomcat源码(转)

    想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...

  4. java温故系列之环境配置

    -----下面的配置符号全部复制,否则会出错 JDK配置: 首先去度娘下载jdk,然后安装.这个就不贴地址了,可能会找不到 1.右键我的电脑->属性->高级系统设置->环境变量 2. ...

  5. 习课的redis配置记录

    <!-- redis begin --> <dependency> <groupId>redis.clients</groupId> <artif ...

  6. 一、OWIN初探

    前言 OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application.基于此标准,鼓励开 ...

  7. asp.net扩展名不显示并获得URL值

    由vs2013新建"web窗体应用程序"的网站,URL不显示扩展名.那今天就实现该功能 1.首先打开vs2013>新建项目>如下图选择 2.选择项目右击>管理Nu ...

  8. c#winform程序,修改MessageBox提示框中按钮的文本

    用winform的MessageBox是实现不了的,这里我用的是DevExpress控件的XtraMessageBoxForm 例如如果想在一个提示框里修改"是","否& ...

  9. Jquery day01

    day01: 基础--选择器.属性和CSS.文档处理 day02: 高级--筛选.事件.效果.ajax jQuery介绍 JS类库 JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用 ...

  10. 自动检测浏览器是手机还是pc

    function CheckBrower() { if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { //判断iPhone|iPad| ...