<address id="fblfv"><form id="fblfv"></form></address>

    <noframes id="fblfv"><address id="fblfv"><nobr id="fblfv"></nobr></address>
    <span id="fblfv"></span>

         找回密碼
         注冊帳號

        掃一掃,訪問微社區

        Like Unity網絡編程之UDPClent實現局域網通信

        13
        回復
        8746
        查看
        打印 上一主題 下一主題
        [ 復制鏈接 ]
        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18

        馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

        您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

        x
        【前言】
        UDP通信,是我最開始做一個視頻同步的功能開始學習的,隨后就開始使用UDPClent做網絡傳輸,我的理解中,UDPClent是system.net網絡程序集下的一個關于UDP的網絡管理器,底層也是和TCP一樣的Socket相關功能封裝,多得也不說了,下面我直接放出代碼,實現一個簡單的發送、接收案例。【基于UDPClent封裝的網絡管理器類——UDP_Manager】接收是同一端口全部接收,所以收發注意一下端口號,收發的端口號要一致。
        using System;
        using System.Net;
        using System.Net.Sockets;
        using System.Text;
        using System.Threading;
        using UnityEngine;
        public class UDPManager : MonoBehaviour
        {
        class UDPData
        {
        private UdpClient udpClient;
        public UdpClient UDPClient
        {
        get { return udpClient; }
        }
        private readonly IPEndPoint endPoint;
        public IPEndPoint EndPoint
        {
        get { return endPoint; }
        }
        //構造函數
        public UDPData(IPEndPoint endPoint
        UdpClient udpClient)
        {
        this.endPoint = endPoint;
        this.udpClient = udpClient;
        }
        }
        public static UDPManager m_instance;
        string receiveData = string.Empty;
        private Action
        <string> ReceiveCallBack = null;
        private Thread RecviveThread;
        private void Awake()
        {
        if (m_instance == null)
        {
        m_instance = this;
        }
        else
        {
        Destroy(this);
        }
        }
        private void Start()
        {
        //開啟線程
        //ThreadRecvive();
        }
        private void Update()
        {
        if (ReceiveCallBack != null &&
        !string.IsNullOrEmpty(receiveData))
        {
        //調用處理函數去數據進行處理
        ReceiveCallBack(receiveData);
        //使用之后清空接受的數據
        receiveData = string.Empty;
        }
        }
        public void SetReceiveCallBack(Action
        <string> action)
        {
        ReceiveCallBack = action;
        }
        UDPData data;
        ///

        /// 開始線程接收
        ///
        public void ThreadRecvive()
        {
        //開一個新線程接收UDP發送的數據
        RecviveThread = new Thread(() =>
        {
        //實例化一個IPEndPoint,任意IP和對應端口 端口自行修改
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any5001);
        UdpClient udpReceive = new UdpClient(endPoint);
        data = new UDPData(endPoint  udpReceive);
        //開啟異步接收
        udpReceive.BeginReceive(CallBackRecvive  data);
        })
        {
        //設置為后臺線程
        IsBackground = true
        };
        //開啟線程
        RecviveThread.Start();
        }
        ///
        /// 異步接收回調
        ///
        ///
        private void CallBackRecvive(IAsyncResult ar)
        {
        try
        {
        //將傳過來的異步結果轉為我們需要解析的類型
        UDPData state = ar.AsyncState as UDPData;
        IPEndPoint ipEndPoint = state.EndPoint;
        //結束異步接受 不結束會導致重復掛起線程卡死
        byte[] data = state.UDPClient.EndReceive(ar  ref ipEndPoint);
        //解析數據 編碼自己調整暫定為默認 依客戶端傳過來的編碼而定
        string receiveData = Encoding.Default.GetString(data);
        Debug.Log(receiveData);
        //數據的解析再Update里執行 Unity中Thread無法調用主線程的方法
        //再次開啟異步接收數據
        state.UDPClient.BeginReceive(CallBackRecvive  state);
        }
        catch (Exception e)
        {
        Debug.LogError(e.Message);
        throw;
        }
        }
        ///
        /// 發送UDP信息
        ///
        /// 發送地址
        /// 發送端口
        /// 需要發送的信息
        public void UDPSendMessage(string remoteIP  int remotePort  string message)
        {
        //將需要發送的內容轉為byte數組 編碼依接收端為主,自行修改
        //byte[] sendbytes = Encoding.GetEncoding(“GB2312”).GetBytes(message);
        byte[] sendbytes = Encoding.Default.GetBytes(message);
        IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Parse(remoteIP)  remotePort);
        UdpClient udpSend = new UdpClient();
        //發送數據到對應目標
        udpSend.Send(sendbytes  sendbytes.Length  remoteIPEndPoint);
        print(“UDPClient發送了=”+message);
        //關閉
        udpSend.Close();
        }
        private void OnApplicationQuit()
        {
        OnDestroy();
        }
        private void OnDestroy()
        {
        print(“關閉UDP連接”);
        if (RecviveThread != null)
        {
        RecviveThread.Abort();
        }
        if (data.UDPClient != null)
        {
        data.UDPClient.Close();
        }
        }
        }


        【測試發送功能——UDP_Send】

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        public class UDPSend : MonoBehaviour
        {
        UDPManager manager;
        // Start is called before the first  update
        void Start()
        {
        //獲取到UDPManager 腳本內部自己開啟了線程無需再次開啟
        manager = GetComponent<UDPManager>();
        if (manager == null)
        {
        manager = gameObject.AddComponent<UDPManager>();
        }
        //設置好解析的方法
        }
        // Update is called once per
        void Update()
        {
        if (Input.GetMouseButtonDown(1))
        {
        manager.UDPSendMessage(“192.168.3.113” 5002
        ”點擊了鼠標右鍵!!”);
        //print(“點擊了鼠標右鍵”);
        }
        }
        }


        【測試接收功能——UDP_Receive】

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        public class UDPRecvice : MonoBehaviour
        {
        void Start()
        {
        //獲取到UDPManager 腳本內部自己開啟了線程無需再次開啟
        UDPManager manager = GetComponent<UDPManager>();
        if (manager == null)
        {
        manager = gameObject.AddComponent<UDPManager>();
        }
        //設置好解析的方法
        manager.SetReceiveCallBack(ReceiveUDPMessage);
        manager.ThreadRecvive();
        }
        void ReceiveUDPMessage(string receiveData)
        {
        //接下來就看自己如何解析了
        Debug.Log(receiveData);
        }
        }






        回復

        使用道具 舉報

        8常駐蠻牛
        5202/10000
        排名
        2959
        昨日變化

        33

        主題

        2909

        帖子

        5202

        積分

        Rank: 8Rank: 8

        UID
        173503
        好友
        7
        蠻牛幣
        2020
        威望
        0
        注冊時間
        2016-10-5
        在線時間
        1772 小時
        最后登錄
        2021-9-15
        沙發
        2020-12-2 17:18:39 只看該作者
        工程案例能否提供依稀啊, 里邊有各種報錯??!
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        板凳
        樓主 2020-12-3 11:41:16 只看該作者
        kuanyidai 發表于 2020-12-2 17:18
        工程案例能否提供依稀啊, 里邊有各種報錯??!

        可能會有“”的字符串里里多了一些\\\\\\,刪一下,如果有其它報錯,可以私聊我
        回復 支持 反對

        使用道具 舉報

        8常駐蠻牛
        5202/10000
        排名
        2959
        昨日變化

        33

        主題

        2909

        帖子

        5202

        積分

        Rank: 8Rank: 8

        UID
        173503
        好友
        7
        蠻牛幣
        2020
        威望
        0
        注冊時間
        2016-10-5
        在線時間
        1772 小時
        最后登錄
        2021-9-15
        地板
        2020-12-3 16:31:31 只看該作者
        測試成功了。  如果多個命令的話 就需要些多個  UDP_Send?  
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        5#
        樓主 2020-12-5 22:15:54 只看該作者
        kuanyidai 發表于 2020-12-3 16:31
        測試成功了。  如果多個命令的話 就需要些多個  UDP_Send?

        只需要調用UDP管理器類都的UDP_Manager.m_instance.UDPSendMessage方法就可以實現發送,注意下里面的ip和端口即可
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        6#
        樓主 2020-12-7 19:21:25 只看該作者
        12-7修改了帖子發布產生的的多余字符串,并測試了代碼,如果有問題歡迎留言
        回復 支持 反對

        使用道具 舉報

        8常駐蠻牛
        5202/10000
        排名
        2959
        昨日變化

        33

        主題

        2909

        帖子

        5202

        積分

        Rank: 8Rank: 8

        UID
        173503
        好友
        7
        蠻牛幣
        2020
        威望
        0
        注冊時間
        2016-10-5
        在線時間
        1772 小時
        最后登錄
        2021-9-15
        7#
        2020-12-19 20:46:26 只看該作者
        我想問一下,在發布IPAD端以后,UDP發送是沒有問題的,但是熄屏以后再點亮屏幕 UDP通信就會中斷? 你有沒有好的辦法, 我聽說有一個解決辦法, 按鈕點擊打開UDP,發送UDP字符串,發送完畢以后再關閉UDP命令,這樣就不怕熄屏跟后臺操作了?
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        8#
        樓主 2020-12-20 10:17:16 只看該作者
        kuanyidai 發表于 2020-12-19 20:46
        我想問一下,在發布IPAD端以后,UDP發送是沒有問題的,但是熄屏以后再點亮屏幕 UDP通信就會中斷? 你有沒有 ...

        首先要檢測一下UDP的連接狀態,UDPData.UDPClient.Client.Connected,如果為false應該就是有地方調用了UDPData.UDPClient.Close(); ,看一下是否調用了OnDestroy()方法,主要針對熄屏以后打印一下,看一下它是什么原因導致的中斷
        回復 支持 反對

        使用道具 舉報

        7日久生情
        3395/5000
        排名
        3717
        昨日變化

        0

        主題

        220

        帖子

        3395

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        246031
        好友
        1
        蠻牛幣
        1740
        威望
        0
        注冊時間
        2017-9-26
        在線時間
        2771 小時
        最后登錄
        2021-9-15
        9#
        2020-12-21 20:07:03 只看該作者
        6666666666666666666666
        回復 支持 反對

        使用道具 舉報

        5熟悉之中
        527/1000
        排名
        7867
        昨日變化

        1

        主題

        120

        帖子

        527

        積分

        Rank: 5Rank: 5

        UID
        47559
        好友
        0
        蠻牛幣
        2
        威望
        0
        注冊時間
        2014-10-2
        在線時間
        248 小時
        最后登錄
        2021-9-6
        10#
        2021-3-5 13:41:30 只看該作者
        這個好,感謝樓主分享
        回復 支持 反對

        使用道具 舉報

        6蠻牛粉絲
        1292/1500

        0

        主題

        48

        帖子

        1292

        積分

        Rank: 6Rank: 6Rank: 6

        UID
        348903
        好友
        2
        蠻牛幣
        419
        威望
        0
        注冊時間
        2020-6-17
        在線時間
        1244 小時
        最后登錄
        2021-9-14
        11#
        2021-3-10 17:16:15 只看該作者
        pc-->android行嗎?
        回復 支持 反對

        使用道具 舉報

        0

        主題

        11

        帖子

        19

        積分

        Rank: 1

        UID
        352435
        好友
        0
        蠻牛幣
        11
        威望
        0
        注冊時間
        2020-9-8
        在線時間
        8 小時
        最后登錄
        2021-6-5
        12#
        2021-3-11 13:45:19 只看該作者
        6666666666666666666666666666666666666
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        13#
        樓主 2021-3-11 15:32:58 只看該作者
        HongHu881 發表于 2021-3-10 17:16
        pc-->android行嗎?

        理論上是沒問題的,我也沒測試過,如果可以也給我留言一下吧
        回復 支持 反對

        使用道具 舉報

        5熟悉之中
        842/1000
        排名
        4826
        昨日變化

        0

        主題

        147

        帖子

        842

        積分

        Rank: 5Rank: 5

        UID
        253671
        好友
        1
        蠻牛幣
        9807
        威望
        0
        注冊時間
        2017-11-10
        在線時間
        393 小時
        最后登錄
        2021-8-31
        14#
        2021-4-27 16:43:28 只看該作者
        LikeIsMe 發表于 2020-12-20 10:17
        首先要檢測一下UDP的連接狀態,UDPData.UDPClient.Client.Connected,如果為false應該就是有地方調用了UD ...

        這個我是檢測程序的狀態,如果處于掛起就斷掉鏈接,程序為激活狀態,如果UDP沒有鏈接就重新鏈接,好像解決了這問題,不知道對不對。
        回復 支持 反對

        使用道具 舉報

        您需要登錄后才可以回帖 登錄 | 注冊帳號

        本版積分規則

        關注游戲蠻牛公眾號送vip
        欧美野性肉体狂欢大派对