<td id="mukkm"><td id="mukkm"></td></td>
  • <nav id="mukkm"></nav>
  • <nav id="mukkm"></nav>
     找回密碼
     注冊帳號

    掃一掃,訪問微社區

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

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

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

    UID
    354297
    好友
    0
    蠻牛幣
    477
    威望
    0
    注冊時間
    2020-11-3
    在線時間
    1126 小時
    最后登錄
    2022-8-17

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

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

    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常駐蠻牛
    5336/10000
    排名
    2959
    昨日變化

    33

    主題

    2979

    帖子

    5336

    積分

    Rank: 8Rank: 8

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

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

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

    使用道具 舉報

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

    33

    主題

    2979

    帖子

    5336

    積分

    Rank: 8Rank: 8

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

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

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

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

    使用道具 舉報

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

    33

    主題

    2979

    帖子

    5336

    積分

    Rank: 8Rank: 8

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

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

    UID
    354297
    好友
    0
    蠻牛幣
    477
    威望
    0
    注冊時間
    2020-11-3
    在線時間
    1126 小時
    最后登錄
    2022-8-17
    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日久生情
    4466/5000
    排名
    3717
    昨日變化

    0

    主題

    233

    帖子

    4466

    積分

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

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

    使用道具 舉報

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

    1

    主題

    124

    帖子

    559

    積分

    Rank: 5Rank: 5

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

    使用道具 舉報

    7日久生情
    2086/5000

    0

    主題

    61

    帖子

    2086

    積分

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

    UID
    348903
    好友
    2
    蠻牛幣
    638
    威望
    0
    注冊時間
    2020-6-17
    在線時間
    2025 小時
    最后登錄
    2022-4-28
    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
    回復 支持 反對

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

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

    使用道具 舉報

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

    0

    主題

    149

    帖子

    918

    積分

    Rank: 5Rank: 5

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

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

    使用道具 舉報

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

    本版積分規則

    關注游戲蠻牛公眾號送vip
    免费一级AA片毛片在线播放
    <td id="mukkm"><td id="mukkm"></td></td>
  • <nav id="mukkm"></nav>
  • <nav id="mukkm"></nav>