Unity中UDP异步通信常用API使用

news2025/4/3 2:15:51

Begin开头的方法

BeginSendTo

BeginSendTo 是 UdpClient 类中的一个重要方法,用于开始一个异步操作来发送 UDP 数据报到指定的远程端点

public IAsyncResult BeginSendTo(
    byte[] datagram,
    int bytes,
    IPEndPoint endPoint,
    AsyncCallback requestCallback,
    object state
);

参数解释

  • datagram:要发送的字节数组,也就是你要发送的数据内容。
  • bytesdatagram 数组中要发送的字节数。
  • endPointIPEndPoint 类型,代表数据报要发送到的远程端点,包含了目标 IP 地址和端口号。
  • requestCallbackAsyncCallback 类型的回调方法,当异步发送操作完成时会调用这个方法。
  • state:一个用户定义的对象,它会被传递给回调方法,可用于在回调方法中携带额外的状态信息。

返回值

该方法返回一个 IAsyncResult 对象,可用于跟踪异步操作的状态。可以把这个对象传递给 EndSendTo 方法来完成异步操作。

BeginReceiveFrom

BeginReceiveFrom 是 UdpClient 类里的一个方法,用于开始一个异步操作,从指定的远程端点接收 UDP 数据报

public IAsyncResult BeginReceiveFrom(
    byte[] buffer,
    int offset,
    int size,
    ref EndPoint remoteEP,
    AsyncCallback requestCallback,
    object state
);

参数解释

  • buffer:用于接收数据的字节数组。
  • offset:在 buffer 中开始存储接收到的数据的偏移量。
  • sizebuffer 中可用于存储数据的最大字节数。
  • remoteEPEndPoint 类型的引用,代表发送数据报的远程端点。在接收操作完成后,该参数会被更新为实际发送数据的远程端点信息。
  • requestCallbackAsyncCallback 类型的回调方法,当异步接收操作完成时会调用此方法。
  • state:一个用户定义的对象,会被传递给回调方法,可用于在回调方法中携带额外的状态信息。

返回值

该方法返回一个 IAsyncResult 对象,可用于跟踪异步操作的状态。你可以把这个对象传递给 EndReceiveFrom 方法来完成异步操作。

Begin开头的方法要和End开头的方法配套使用

Async结尾的方法

SendToAsync

SendToAsync 是 UdpClient 类中用于异步发送 UDP 数据报到指定远程端点的方法,它是 .NET 中提供的基于任务的异步模式(TAP)的方法,相比于传统的 BeginSendTo 和 EndSendTo 组合,使用起来更加简洁和直观,结合 async 和 await 关键字能让代码更具可读性。

public Task<int> SendToAsync(byte[] datagram, int bytes, IPEndPoint endPoint);

参数解释

  • datagram:要发送的字节数组,即你要传输的数据内容。
  • bytesdatagram 数组中要发送的字节数。
  • endPointIPEndPoint 类型,代表数据报要发送到的远程端点,包含目标 IP 地址和端口号。

返回值

该方法返回一个 Task<int> 对象,Task 表示异步操作,int 表示实际发送的字节数。你可以使用 await 关键字等待这个任务完成,并获取发送的字节数。

ReceiveFromAsync

ReceiveFromAsync 是 UdpClient 类中的一个方法,它以异步方式从指定的远程端点接收 UDP 数据报。这个方法遵循基于任务的异步模式(TAP),借助 async 和 await 关键字,能够让代码的异步操作变得更加简洁和易读。

public Task<UdpReceiveResult> ReceiveFromAsync();

返回值

该方法返回一个 Task<UdpReceiveResult> 对象。Task 代表一个异步操作,而 UdpReceiveResult 是一个结构体,包含两个重要属性:

  • Buffer:一个字节数组,存储着接收到的数据。
  • RemoteEndPointEndPoint 类型,指示发送数据的远程端点。

方法使用

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;

public class Lesson16 : MonoBehaviour
{
    byte []cachebytes = new byte[512];
    // Start is called before the first frame update
    void Start()
    {
        #region UDP异步通信中begin相关的方法
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //BeginSendTo
        byte[] bytes = Encoding.UTF8.GetBytes("w9r39hjfwaofi");
        EndPoint IpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
        socket.BeginSendTo(bytes, 0, bytes.Length, SocketFlags.None, IpPoint, SendOver, socket);
        //BeginReceiveFrom
        socket.BeginReceiveFrom(cachebytes, 0, cachebytes.Length, SocketFlags.None, ref IpPoint, ReceiveFromOver, (socket, IpPoint));
        #endregion
        #region UDP异步通信中Async结尾的方法
        //SendToAsync
        SocketAsyncEventArgs args = new SocketAsyncEventArgs();
        args.SetBuffer(bytes, 0, bytes.Length);
        args.Completed += SendAsync;
        socket.SendToAsync(args);
        //ReceiveFromAsync
        SocketAsyncEventArgs args2 = new SocketAsyncEventArgs();
        socket.ReceiveFromAsync(args2);
        args2.SetBuffer(cachebytes, 0, cachebytes.Length);
        args2.Completed += ReceiveAsync;
        #endregion 
    }
    private void SendOver(IAsyncResult result)
    {
        try
        {
            Socket s = result.AsyncState as Socket;
            s.EndSendTo(result);
        }
        catch (SocketException s)
        {
            print("发消息出问题了" + s.SocketErrorCode + s.Message);
        }
      
    }
    private void ReceiveFromOver(IAsyncResult result)
    {
        try
        {
            (Socket s, EndPoint ipPont) info = ((Socket ,EndPoint))result.AsyncState;
            //返回值 就是接收了多少个字节数
            int num=info.s.EndReceiveFrom(result, ref info.ipPont);
            //处理消息

            //处理完消息继续接收消息
            info.s.BeginReceiveFrom(cachebytes, 0, cachebytes.Length,SocketFlags.None,ref info.ipPont, ReceiveFromOver, info);
        }
        catch (SocketException s)
        {
            print("接收消息失败" + s.SocketErrorCode + s.Message);
        }
    }
    private void SendAsync(object s,SocketAsyncEventArgs args)
    {
        try
        {
            print("发消息成功");
        }
        catch (SocketException e)
        {
            print("发消息出问题了" + e.SocketErrorCode + e.Message);
        }
    }
    private void ReceiveAsync(object s,SocketAsyncEventArgs args)
    {
       if(args.SocketError ==SocketError.Success)
       {
            print("接收消息成功");
            //具体收了多少字节
            //args.BytesTransferred
            //可以通过以下两种方式获取收到的字节数组的内容
            //args.Buffer
            //cacheBytes
            //解析消息

            Socket socket = s as Socket;
            args.SetBuffer(0, cachebytes.Length);
            //只需要设置从第几个位置开始接 能接多少
            socket.ReceiveFromAsync(args);
       }    
       else
        {
            print("收消息失败");
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[AI绘图] ComfyUI 中自定义节点插件安装方法

ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…

【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】

【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言&#xff1a; 连接步骤说明 一. 硬件连接 支持的相机接口类型&#xff1a; 连接步骤 2. 软件配置 Visio…

蓝桥杯 之 图论基础+并查集

文章目录 习题联盟X蓝桥幼儿园 图论基础 并查集 并查集&#xff0c;总的来说&#xff0c;操作分为三步初始化(每一个节点的父亲是自己)&#xff0c;定义union(index1,index2)函数&#xff0c;定义find(index)函数 并查集详细内容博客 习题 联盟X 联盟X 典型的求解连通分支…

C# .net ai Agent AI视觉应用 写代码 改作业 识别屏幕 标注等

C# net deepseek RAG AI开发 全流程 介绍_c# 向量处理 deepseek-CSDN博客 视觉多模态大模型 通义千问2.5-VL-72B AI大模型能看懂图 看懂了后能干啥呢 如看懂图 让Agent 写代码 &#xff0c;改作业&#xff0c;识别屏幕 标注等等。。。 据说是目前最好的免费图片识别框架 通…

15届蓝桥JavaB组 前6道题解

15届蓝桥JavaB组 前6道题解 报数游戏类斐波那契循环数分布式队列食堂最优分组星际旅行 报数游戏 import java.util.Scanner;//分析&#xff1a; //20和24的最小公倍数是120 //题目给出了前10个数&#xff0c;发现第10个数是120&#xff0c;说明每10个数出现一个公倍数 //第20个…

蓝桥杯 14 天 十五届蓝桥杯 数字诗意

static boolean kkk(long x) {if(x1)return true;else {// 初始化xx为1&#xff0c;用于计算2的幂long xx 1;// 循环60次&#xff0c;检查2的幂是否等于xfor (int i 1; i < 60; i) {xx * 2; // 每次将xx乘以2if (xx x) { // 如果xx等于x&#xff0c;说明x是2的幂&#xf…

MP4音视频格式

1.MP4 MP4是一种用于封装音视频/字幕/图片/章节信息等数据的多媒体容器格式&#xff0c;是MPEG-4系列的成员之一 2.文件结构 MP4由一层层的嵌套Box&#xff08;atom&#xff09;组成 [ size (4 bytes) ][ type (4 bytes)][ payload (嵌套box或者数据) ] 3.常见Box 类型名称…

国内GitHub镜像源全解析:加速访问与替代方案指南

在数字化开发日益普及的今天,GitHub作为全球最大的代码托管平台,已成为开发者不可或缺的资源库。然而,由于网络环境的限制,国内用户在访问GitHub时常常面临速度慢、连接不稳定等问题。为了提升开发效率,国内涌现出多个GitHub镜像源,为开发者提供了快速、稳定的代码克隆与…

Vue3动态加载组件,警告:Vue received a Component than was made a reactive object

场景 2个按钮&#xff0c;点击之后&#xff0c;下面加载不同的组件。 现象 分析 实际动态加载的组件&#xff0c;不是深层响应式的&#xff0c;推荐使用 shallowReactive 或 shallowRef&#xff0c;即浅层作用形式&#xff0c;仅最外层是响应式&#xff0c;以此来提升性能。…

【源码阅读/Vue Flask前后端】简历数据查询功能

目录 一、Flask后端部分modelServiceroute 二、Vue前端部分index.js main.vue功能界面templatescriptstyle 一般就是三个层面&#xff0c;model层面用来建立数据库的字段&#xff0c;service用来对model进行操作&#xff0c;写一些数据库操作的代码&#xff0c;route就是具体的…

Vue背景介绍+声明式渲染+数据响应式

一、Vue背景 1. 为什么学Vue 1.前后端开发就业必备技能 2.岗位多&#xff0c;绝⼤互联⽹公司都在使⽤Vue&#xff0c;还可以助⼒SpringBoot、C等项⽬开发 3.提⾼开发效率 更少的时间,干更多的活,提高项目开发速度 原生JS做法 Vue做法 总而言之: 使用Vue能够赋能、提升就业竞争…

HarmonyOS NEXT 鸿蒙中手写和使用第三方仓库封装Logger打印工具

应用场景 在鸿蒙开发中&#xff0c;我们在很多时候调试代码都需要用到日志打印工具&#xff0c;但无论是hilog还是console.log,都用起来相对麻烦&#xff0c;而且需要手动将对象转换为JSON字符串的方式才能打印&#xff0c;并且在控制台日志中输出的格式也非常丑。所以下面我们…

批量合并 PDF 文档,支持合并成单个文档,也支持按文件夹合并 PDF 文档

在日常工作中&#xff0c;合并多个 PDF 文档为一个文件是非常常见的需求。通过合并 PDF&#xff0c;不仅能够更方便地进行管理&#xff0c;还能在特定场景下&#xff08;如批量打印&#xff09;提高效率。那么&#xff0c;当我们需要批量合并多个 PDF 文件时&#xff0c;是否有…

rbpf虚拟机-汇编和反汇编器

文章目录 一、概述二、主要功能三、关键函数解析3.1 汇编器3.1.1 parse -转换为Instruction列表3.1.2 assemble_internal-转换为Insn 3.2 反汇编器3.2.1 to_insn_vec-转换为机器指令 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-汇编和反汇编器] ❤…

虚拟现实--->unity学习

前言&#xff1a;这学期劳动课选了虚拟现实&#xff0c;其中老师算挺认真的&#xff0c;当然对一些不感兴趣的同学来说是一种折磨&#xff0c;我对这个unity的学习以及后续的虚幻引擎刚开始连基础的概念都没有&#xff0c;后面渐渐也是滋生了一些兴趣&#xff0c;用这篇博客记录…

一文详解QT环境搭建:ubuntu20.4安装配置Qt5

随着软件开发技术的不断进步&#xff0c;跨平台应用程序的需求日益增长&#xff0c;开发者们面临着如何在不同操作系统之间保持代码的一致性和效率的问题。Qt作为一个成熟的跨平台C框架&#xff0c;在这方面提供了卓越的支持&#xff0c;不仅简化了GUI应用程序的创建过程&#…

【IDEA的个性化配置】

目录&#xff1a; 一&#xff1a;隐藏项目路径二&#xff1a;禁用斜体注释三&#xff1a;重新Maven构建未完待续... 一&#xff1a;隐藏项目路径 &#x1f60a;在IDEA左侧的Project目录中&#xff0c;项目名称后面显示了项目的文件路径地址&#xff0c;如果不喜欢可以隐藏&…

【Kafka】分布式消息队列的核心奥秘

文章目录 一、Kafka 的基石概念​主题&#xff08;Topic&#xff09;​分区&#xff08;Partition&#xff09;​生产者&#xff08;Producer&#xff09;​消费者&#xff08;Consumer&#xff09;​ 二、Kafka 的架构探秘​Broker 集群​副本机制​ 三、Kafka 的卓越特性​高…

自动化发布工具CI/CD实践Jenkins部署与配置教程

1. 前言背景 其实一直想把jenkins 的笔记整理下&#xff0c;介于公司这次升级jenkins2.0 &#xff0c;根据自己部署的一些经验&#xff0c;我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目&#xff0c;随着项目的日益增多&#x…

什么是SQL作业

SQL作业是在数据库服务器上按特定时间或间隔自动执行的计划任务或流程&#xff0c;这些作业由Microsoft SQL Server中的SQL Server代理管理&#xff0c;对于自动执行日常任务&#xff08;如数据库系统中的备份、数据导入和报告生成&#xff09;以及确保及时准确地处理和更新数据…