• unity_Socket_UDP广播协议的接收发送(客户端模块)


    接收Socket_UDP广播机制的客户端实现,不多说直接上代码:

    using System;
    using System.Text;
    using System.Threading;
    using UnityEngine;
    using System.Net.Sockets;
    using System.Net;
    using System.Collections.Generic;
    
    //
    using System.Xml;
    
    
    public class Lighthouse : MonoBehaviour
    {
        private byte[] data;
        private string Error_Message;
        private Thread thread;
        private EndPoint ep;
        private bool IsStop = false;
        private Socket socket;
        private int udpPort = 9090;
        public static Lighthouse instance;
    
        // 消息回调
        private static string m_callMessage = string.Empty;
        private bool m_isTCP = true;
    
        private void Awake()
        {
            if (instance == null)
            {
                instance = this;
                //
                // GetSeverIP();
                //DontDestroyOnLoad(gameObject);
            }
            //else
            //{
            //    Destroy(gameObject);
            //}
    
            //
            m_isTCP = true;
        }
    
    
        private void Update()
        {
            if (m_isTCP)
            {
                if (!string.IsNullOrEmpty(m_callMessage))
                {
                    this.SendUDP_SceneInfo();
                    // 建立TCP连接
                    Client._Instance.StartConnect(this.Analyse_XMLIP());
                    //
                    m_isTCP = false;
                }
            }
        }
    
    
        public void GetSeverIP()
        {
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                ep = new IPEndPoint(IPAddress.Any, udpPort);
                socket.Bind(ep);
                data = new byte[1024];
                thread = new Thread(Receive);
                thread.IsBackground = true;
                thread.Start();
            }
            catch (Exception e)
            {
                Debug.LogError("错误信息:" + e.Message);
            }
    
        }
    
        public void StopReceive()
        {
            IsStop = true;
            thread.Abort();
        }
    
        private void Receive()
        {
            while (!IsStop)
            {
                if (socket.Available <= 0) continue;
                int recv = socket.ReceiveFrom(data, ref ep);
                string msg = Encoding.ASCII.GetString(data, 0, recv);
                // Debug.Log("接收消息:" + msg);
                Debug.Log("[UDP+接收消息]" + msg);
    
                //
                m_callMessage = string.Empty;
                m_callMessage = msg;
                //测试
                //if(recv > 0)
                //{
                //    Send(msg);
                //}
                //Thread.Sleep(100);
            }
        }
    
    
        public void Send(string msg)
        {
            //msg = "客户端消息:66666666666";
            Debug.Log("[UPD+发送消息]" + msg);
    
    
            data = Encoding.UTF8.GetBytes(msg);
            try
            {
                socket.SendTo(data, ep);
            }
            catch (Exception ex)
            {
                Debug.Log("错误信息" + ex.Message);
            }
        }
    
    
        public void OnApplicationQuit()
        {
            if (socket != null)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            IsStop = true;
            thread.Abort();
        }
    
        //信息_ID_场景_0或回调信息
        // 发送UDP数据
        private void SendUDP_SceneInfo()
        {
            UDPMessage um = new UDPMessage(MessageType.Register,0,"故宫","0");
            //
            Send(um.ToString());
        }
    
    
        // 解析xml中的ip地址
        private string Analyse_XMLIP()
        {
            //
            string strUrl = "D:/LUYOU_File/Msg/addressInfo.xml";
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(strUrl);
            //
            if (xmlDoc!=null)
            {
                XmlElement node=(XmlElement)xmlDoc.SelectSingleNode("address/ip");
                return node.InnerText.Trim();
            }
            return null;
        }
    }
    
    public class UDPMessage {
    
        private MessageType msgType;
        private int PlayerID;
        private string strSceneName;
        private string strCallMessage;
    
        public UDPMessage(MessageType type,int id,string sceneName,string callMessage)
        {
            this.msgType = type;
            this.PlayerID = id;
            this.strSceneName = sceneName;
            this.strCallMessage = callMessage;
        }
    
        public override string ToString()
        {
            return string.Format("{0}_{1}_{2}_{3}#",(int)msgType,PlayerID,strSceneName,strCallMessage);
        }
    }

    个人笔记 欢迎指正

  • 相关阅读:
    Elasticsearch 机制 架构 集群 选举
    《Leo the late bloomer》阿虎开窍了
    各行业发明专利排行榜
    接口响应 越来越慢
    知识产权代理 与 工作流
    MBA Business Org Responsbility Account Stock
    心理学 防内耗
    Apache Kafka Zookeeper Quorum
    The different aspect of architecture(架构的不同方面)
    hPaPaas low-code/no-code 低代码
  • 原文地址:https://www.cnblogs.com/Roz-001/p/12106600.html
Copyright © 2020-2023  润新知