zoukankan      html  css  js  c++  java
  • C#UDP异步通信

    using SetingDemo.LogHelp;
    using SetingDemo.SingleRowDeclare;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;

    namespace SetingDemo.SocketHelp
    {
    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;
    // 定义UDP发送和接收
    private UdpClient udpReceive = null;
    private UdpClient udpSend = null;
    // 定义端口
    private const int listenPort = 60091;
    private const int remotePort = 60091;
    UdpState udpReceiveState = null;
    UdpState udpSendState = null;
    // 异步状态同步
    private ManualResetEvent sendDone = new ManualResetEvent(false);
    private ManualResetEvent receiveDone = new ManualResetEvent(false);
    public AsyncUdpSever()
    {

    }
    public void ReceiveMsg()
    {

    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);
    Task.Run(() =>
    {
    Application.Current.Dispatcher.Invoke(() =>
    {
    CKInstanceBase<ReviceMsgClass>.Instance.AddMsg(string.Concat("Udp接收:", receiveString));
    });
    });
    Console.WriteLine("UDP-Received: {0}", receiveString);
    //Thread.Sleep(100);
    receiveDone.Set();
    }
    }
    // 发送函数
    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 void StatUdpRecv()
    {
    // 本机节点
    ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);
    // 远程节点
    remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 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;
    Thread t = new Thread(new ThreadStart(ReceiveMsg));
    t.IsBackground = true;
    t.Start();
    Console.Read();
    }
    }
    }

  • 相关阅读:
    git使用命令行方式提交代码到github或gitlab上
    如何创建AnjularJS项目
    基于react-native android的新闻app的开发
    Windows下搭建React Native Android开发环境
    python打怪之路【第一篇】:99乘法表
    python成长之路【第四篇】:装饰器
    python成长之路【第三篇】:函数
    python成长之路【第二篇】:列表和元组
    python成长之路【第一篇】:python简介和入门
    JavaScript进阶--慕课网学习笔记
  • 原文地址:https://www.cnblogs.com/LCLBook/p/11697431.html
Copyright © 2011-2022 走看看