• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#基于UDP进行异步通信的方法

C#基于UDP进行异步通信的方法

作者:songguo 字体:[增加 减小] 来源:互联网 时间:2017-05-28

songguo 通过本文主要向大家介绍了c#udp异步通信,c#udp高并发异步通信,c#udp通信,c#socket udp,c#实现udp编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了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();
  }
 }
}
</div>

客户端:

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();
  }
 }
}
</div>

希望本文所述对大家的C#程序设计有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#基于UDP进行异步通信的方法
  • C#实现异步连接Sql Server数据库的方法
  • C#实现异步发送邮件的方法
  • C#中使用UDP通信实例
  • C#同步、异步远程下载文件实例
  • c#实现简单控制台udp异步通信程序示例
  • C#获取Windows进程监听的TCP/UDP端口实例
  • 如何应用C#实现UDP的分包组包

相关文章

  • 2017-05-28C#搜索文字在文件及文件夹中出现位置的方法
  • 2017-05-28C#实现listview Group收缩扩展的方法
  • 2017-05-28C#基于纯数学方法递归实现货币数字转换中文功能详解
  • 2017-05-28解析如何使用反射调用类型成员 方法,字段,属性
  • 2017-05-28C#生成随机数实例
  • 2017-05-28c#图片处理之图片裁剪成不规则图形
  • 2017-05-28C# 反射(Reflection)的用处分析
  • 2017-05-28C#中利用代理实现观察者设计模式详解
  • 2017-05-28Question:基于C#连续赋值的面试题介绍
  • 2017-05-28C# 当前系统时间获取及时间格式详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入浅出23种设计模式
    • C#使用开源驱动连接操作MySQL数据库
    • c#循环左移字符示例
    • C#利用XML创建Excel文档的实现方法
    • C#实现路由器断开连接,更改公网ip的实例代码
    • 使用C#写了一个可以推算火车票身份证号码的小程序
    • C#图像处理之图像均值方差计算的方法
    • c#中返回文章发表的时间差的示例
    • C#使用二分查找法判断指定字符的方法
    • C#的WebBrowser操作frame实例解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有