C#基于UDP进行异步通信的方法
作者:songguo 时间:2022-03-20 18:23:55
本文实例讲述了C#基于UDP进行异步通信的方法。分享给大家供大家参考。具体如下:
服务器端:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace AsyncServer
{
public class UdpState
{
public UdpClient udpClient;
public IPEndPoint ipEndPoint;
public const int BufferSize = 1024;
public byte[] buffer = new byte[BufferSize];
public int counter = 0;
}
public class AsyncUdpSever
{
private IPEndPoint ipEndPoint = null;
private IPEndPoint remoteEP = null;
private UdpClient udpReceive = null;
private UdpClient udpSend = null;
private const int listenPort = 1100;
private const int remotePort = 1101;
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);
udpReceive = new UdpClient(ipEndPoint);
udpSend = new UdpClient();
udpReceiveState = new UdpState();
udpReceiveState.udpClient = udpReceive;
udpReceiveState.ipEndPoint = ipEndPoint;
udpSendState = new UdpState();
udpSendState.udpClient = udpSend;
udpSendState.ipEndPoint = remoteEP;
}
public void ReceiveMsg()
{
Console.WriteLine("listening for messages");
while(true)
{
lock (this)
{
IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);
receiveDone.WaitOne();
Thread.Sleep(100);
}
}
}
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("Received: {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
{
public class UdpState
{
public UdpClient udpClient = null;
public IPEndPoint ipEndPoint = null;
public const int BufferSize = 1024;
public byte[] buffer = new byte[BufferSize];
public int counter = 0;
}
public class AsyncUdpClient
{
public static bool messageSent = false;
// Receive a message and write it to the console.
private const int listenPort = 1101;
private const int remotePort = 1100;
private IPEndPoint localEP = null;
private IPEndPoint remoteEP = null;
private UdpClient udpReceive = null;
private UdpClient udpSend = null;
private UdpState udpSendState = null;
private UdpState udpReceiveState = null;
private int counter = 0;
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(Dns.GetHostAddresses(Dns.GetHostName())[0],remotePort);
udpReceive = new UdpClient(localEP);
udpSend = new UdpClient();
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(200);
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(100);
}
}
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("Received: {0}", receiveString);
receiveDone.Set();
}
}
public static void Main()
{
AsyncUdpClient auc = new AsyncUdpClient();
auc.SendMsg();
Console.Read();
}
}
}
希望本文所述对大家的C#程序设计有所帮助。
标签:C#,UDP,异步通信
0
投稿
猜你喜欢
Java Socket实现传输压缩对象的方法示例
2022-12-18 06:52:30
C#窗体传值代码方法
2022-12-03 22:57:37
SpringCloud Alibaba 基本开发框架搭建过程
2023-04-21 03:23:43
详解Spring MVC CORS 跨域
2023-11-25 08:04:37
使用Jenkins来构建SVN+Maven项目的实现
2023-07-30 12:45:22
java两个integer数据判断相等用==还是equals
2021-06-14 00:46:52
Springmvc ResponseBody响应json数据实现过程
2022-06-12 15:22:30
浅谈JAVA中输入输出流实例详解
2022-10-21 05:20:57
MyBatis图文并茂讲解注解开发多对多查询
2022-10-27 17:05:04
Java聊天室之实现获取Socket功能
2023-09-19 03:57:10
Android App实现监听软键盘按键的三种方式
2021-09-14 10:39:27
java算法实现预测双色球中奖号码
2022-06-19 17:01:22
Java中ArrayList初始化的四种方法详解
2022-03-29 21:50:13
struts2实现多文件上传的示例代码
2022-03-09 23:40:54
JavaWeb验证码校验功能代码实例
2022-07-18 23:46:52
简单解析java方法在调用在内存中的执行过程
2022-04-12 15:46:26
使用Spring开启注解AOP的支持放置的位置
2022-08-16 19:16:33
springboot 如何设置端口号和添加项目名
2022-01-11 07:31:12
Java实现部门员工管理
2021-07-21 21:40:41
java中JSONObject转换为HashMap(方法+main方法调用实例)
2023-08-10 04:04:08