Unity简单的UDP通信

这篇具有很好参考价值的文章主要介绍了Unity简单的UDP通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


UDP通信的优势

UDP通信的优势在于不要求对方强制在线,没有因为网络连接不顺畅或连接失败导致的卡顿问题;缺点也是因为不能判断对方是否在线,导致整个连接不可靠,需要通过自定义代码来进行反馈。

UDP的使用

下列代码就是一个简单的UDP通信基类,继承此类后,需调用 InitSocket 方法初始化才可使用,这里没有直接初始化的原因是有可能需要修改端口号或者在其他设置之后才能进行初始化操作,所以初始化操作放到子类进行。
初始化完成后,就可以通过 SendMessage 发送消息,通过 DequeueData 获取收到的消息,通过 DequeueDataCount 查看未处理消息数量,从而实现一个简单的UDP通信。文章来源地址https://www.toymoban.com/news/detail-506892.html


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

public class UDPBase : MonoBehaviour
{

    protected int localPort = 54321;      //本地端口
    protected int sendPort = 12345;       //接收端的端口

    private Socket serverSocket;        //Socket对象用于创建本地UDP通道
    private static UdpClient client;    //UdpClient对象,用于与接收端通信
    private EndPoint clientEndPoint;    //用于承载发送消息的服务器的EndPoint信息
    private byte[] ReceiveData = new byte[1024];    //创建数据缓冲区,用于接收发送来的数据
    private Queue<byte[]> dataQueue = new Queue<byte[]>();  //接收数据队列,存入原始数据,特性:先入先出


    /// <summary>
    /// 初始化Socket
    /// </summary>
    protected void InitSocket()
    {
        //实例化UDP服务器的Socket通道
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //Socket绑定IP和端口
        serverSocket.Bind(new IPEndPoint(IPAddress.Any, localPort));
        clientEndPoint = (EndPoint)new IPEndPoint(IPAddress.Any, 0);
        //开始异步接收数据
        serverSocket.BeginReceiveFrom(ReceiveData, 0, ReceiveData.Length, 
            SocketFlags.None, ref clientEndPoint, new AsyncCallback(ReceiveMessageToQueue), clientEndPoint);

        client = new UdpClient();

    }

    /// <summary>
    /// 接收消息并存放 
    /// </summary>
    /// <param name="iar"></param>
    private void ReceiveMessageToQueue(IAsyncResult iar)
    {
        int receiveDataLength = serverSocket.EndReceiveFrom(iar, ref clientEndPoint);

        //继续监听
        serverSocket.BeginReceiveFrom(ReceiveData, 0, ReceiveData.Length,
            SocketFlags.None, ref clientEndPoint, new AsyncCallback(ReceiveMessageToQueue), clientEndPoint);

        if (receiveDataLength > 0)
        {
            byte[] data = new byte[receiveDataLength];
            Buffer.BlockCopy(ReceiveData,0, data,0, receiveDataLength);
            dataQueue.Enqueue(data);
        }

    }

    /// <summary>
    /// 从队列中取出数据
    /// </summary>
    /// <returns></returns>
    protected byte[] DequeueData()
    {
       return dataQueue.Dequeue();
    }

    protected int DequeueDataCount
    {
        get { return dataQueue.Count; }
    }



    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="ipEndPoint"></param>
    /// <param name="sendData"></param>
    protected void SendMessage(IPEndPoint ipEndPoint, byte[] sendData)
    {
        client.Send(sendData, sendData.Length, ipEndPoint);
    }

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="ipEndPoint"></param>
    /// <param name="sendStr"></param>
    protected void SendMessage(IPEndPoint ipEndPoint, string sendStr)
    {
        byte[] sendData = System.Text.Encoding.UTF8.GetBytes(sendStr);
        SendMessage(ipEndPoint, sendData);
    }


    /// <summary>
    /// 关闭Socket
    /// </summary>
    public void SocketQuit()
    {
        if (serverSocket != null)
        {
            serverSocket.Close();
        }
    }


    /// <summary>
    /// 当关闭此对象时关闭Socket
    /// </summary>
    private void OnDestroy()
    {
        SocketQuit();
    }


}

到了这里,关于Unity简单的UDP通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】网络通信(TCP&UDP)

    Unity/C#要想和其他电脑或者软件程序通讯,最好的方式是通过网络进行通讯,下面简要介绍以下其原理和实现: TCP和UDP是传输层协议,使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。 两者的不

    2024年01月16日
    浏览(38)
  • Unity-UDP-客户端/服务器通信功能

    这里简单实现客户端和服务器,复杂的实现需要和前几篇文章的TCP一样,管理多个链接过来的客户端,这里只有一个。需要自己封装类似listener来管理多个链接过来的设备,每次都缓存ReceiveAsync收到消息的中的RemoteEndPoint地址端口,统一管理发送接收消息。 https://zhidao.baidu.c

    2024年02月11日
    浏览(52)
  • 【嵌入式学习】网络通信基础-项目篇:简单UDP聊天室

    源码已在GitHub开源:0clock/LearnEmbed-projects/chat 客户端功能: 上线发送登录的用户名[yes] 发送消息和接收消息[yes] quit退出 服务器端功能: 统计用户上线信息,放入链表中[yes] 接收用户信息并给其他用户发送消息[yes] 服务器也支持给所有用户群发消息[yes] 接收下线提醒

    2024年01月25日
    浏览(40)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(47)
  • 【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

    源IP地址(Source IP Address): 源IP地址是数据包发送方(或数据流出发点)的唯一标识符。它用于在互联网或本地网络中定位发送数据包的设备或主机。源IP地址是数据包的出发点,即数据从这个地址开始传送,向目的IP地址指示的设备发送。 在TCP/IP协议中,源IP地址通常由发

    2024年02月14日
    浏览(67)
  • unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

    今天调试和服务器连接,发现始终获取不到服务器的数据, 电脑和服务器都在同一局域网,仍然获取不到, 下面是电脑环境配置, 第一步: 设置网络为专用网络,然后点击配置防火墙和安全设置,关闭防火墙 (点击所连接的wifi的属性) 第二步:设置出站 入站规则 点击高

    2024年02月07日
    浏览(48)
  • 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能。多人聊天只需要将A客户端发来的消息,转发给除A客户端外的其他客户端,即可实现。如果你还不怎么熟悉服务端

    2024年02月03日
    浏览(51)
  • Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

    C#服务端用到Fleck包,它包含哪些可用的回调函数,有哪些常用的api方法? 演示:服务端收到Unity用户发来的信息 Fleck提供的回调函数有下面几种: 其它常用的api主要有: ping pong的作用是啥? WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的

    2024年02月08日
    浏览(33)
  • 转让北京通信工程施工二级资质公司要求和价格

          随着通信市场的不断扩大,通信工程企业的发展也越来越快。在通信施工市场中,拥有二级资质的企业才能够更好、更稳定地参与市场竞争,可是资质申请过程较为繁琐,对于很多中小企业而言缺少人力、财力、精力等情况下,其实资质转让也是一种不错的选择。事

    2024年04月09日
    浏览(27)
  • QT网络通信-TCP、UDP通信

    时间记录:2024/1/17 pro文件添加模块network (1)创建TCP服务器对象 QTcpServer (2)为 QTcpServer 对象的 newConnection 信号绑定槽,用来监听TCP客户端的新连接,有新的客户端连接便会触发此信号 (3)使用 nextPendingConnection 方法获取连接的Tcp客户端对象 QTcpSocket (4)为 QTcpSocket 的 r

    2024年01月18日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包