[Unity]简单UDP

一、代码

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

//针对回调函数,定义一个消息list,在Update里处理消息
// private List<string> UDPOrders = new List<string>();
//void Update()
//{
//    if (UDPOrders.Count > 0)
//    {
//        Log.text = "Recv:" + UDPOrders[0];
//        //处理一个清空一个
//        UDPOrders.RemoveAt(0);
//    }
//}
public delegate void RecvCallBack(string msg);

public class AnUDP 
{
    //默认使用ASCII
    private int UdpPort;//端口号
    private bool IsUdpVaild;//是否可用
    private Socket UdpSocket;//socket
    private Thread RecvThread;//接收线程
    private RecvCallBack CallBack;//回调函数

    public AnUDP()
    {
        UdpPort = 0;
        CallBack = null;
        IsUdpVaild = false;
    }

    public bool Open(string SelfIP,int SelfPort)
    {
        Debug.Log(SelfIP);
        UdpPort = SelfPort;
        //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
        IPEndPoint UdpPoint = new IPEndPoint(IPAddress.Parse(SelfIP), UdpPort);
        //定义套接字类型,在主线程中定义
        UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        UdpSocket.Bind(UdpPoint);
        //
        IsUdpVaild = true;
        return true;
    }

    public void Close()
    {
        if (RecvThread != null)
        {
            RecvThread.Abort();
            RecvThread.Interrupt();
        }
        UdpSocket.Close();
    }

    public bool SendTo(string TargetIP, int TargetPort,string msg)
    {
        if (!IsUdpVaild) return false;
        //清空发送缓存
        byte[] sendData = new byte[1024];
        //数据类型转换
        sendData = Encoding.ASCII.GetBytes(msg);
        //
        EndPoint sendPoint = new IPEndPoint(IPAddress.Parse(TargetIP), TargetPort);
        //发送给指定客户端
        UdpSocket.SendTo(sendData, sendData.Length, SocketFlags.None, sendPoint);
        return true;
    }

    public void StartRecv(RecvCallBack _call)
    {
        if (!IsUdpVaild) return;
        if (RecvThread==null)
        {
            RecvThread = new Thread(new ThreadStart(SocketReceive));
            RecvThread.Start();
        }
        //接收回调
        CallBack = _call;
    }

    private void SocketReceive()
    {
        while (true)
        {
            try
            {
                //创建消息
                byte[] recvData = new byte[1024];
                EndPoint recvPoint = new IPEndPoint(IPAddress.Any, UdpPort);
                //接收
                int recvLen = UdpSocket.ReceiveFrom(recvData, ref recvPoint);
                if (recvLen > 0)
                {
                    string data = Encoding.ASCII.GetString(recvData, 0, recvLen);
                    if (CallBack!=null)
                    {
                        CallBack(data);
                    }
                }
            }
            catch (Exception e)
            {

            }
        }
    }
}

二、针对回调函数

1.定义消息队列
private AnUDP UPD;
private List<string> UDPOrders = new List<string>();

2.定义回调函数
void OnUDPRecv(string data)
{
    UDPOrders.Add(data);
}

3.启用UDP并设置回调
UPD = new AnUDP();
if(UPD.Open(SelfIP,Selfport))
{
    UPD.StartRecv(OnUDPRecv);
}

4.发送
UPD.SendTo("127.0.0.1",10000,"Hello");

三、针对SocketException

    出现错误:SocketException: 在其上下文中,该请求的地址无效。一般都是你的ip地址不是所在网段里的地址

猜你喜欢

转载自blog.csdn.net/qq_36251561/article/details/128560772