当前位置:   article > 正文

Unity使用UDP接收数据_unity udp接收

unity udp接收

在雷达互动系统中,由于硬件问题,程序容易误触,为了解决这个问题,通过UDP传送协议控制程序部分功能。例如:中控(平板)发送1,在程序中视频1播放,中控(平板)发送2,程序中视频2播放。

  1. 网络调试助手的下载

链接:https://pan.baidu.com/s/1Vvs6HfmFrPEUn1gKVULymg?pwd=jl98

提取码:jl98

  1. 设置本地主机地址和端口,远程主机的地址和串口号

(1)一台主机测试时(自己电脑测试):

上方框中

第一个先选UDP

第二个框中输入本机主机地址,就是电脑的ip地址(按win+R调出一个窗口,输入CMD,然后在弹出的框中输入ipconfig,出现的内容中,ipv4地址就是本机的ip地址)

第三个框中就是端口号,端口号是4位,可以输入未被占用的任意四位,例如:8800,8080。

设置完成后,通过点击开启按钮就可以打开端口(图片是打开后的状态,只有打开后才会显示下方框中的内容)

下方框中

就是需要控制的主机的ip和端口号,由于是一台电脑,所以主机的ip是一样的,“:”后面是端口号,端口号是在程序中显示的未被占用的端口号,本案例中是1180。

通过发送不同的数据,在程序中把需要接收的数据写进去,然后再写相对应的方法即可。

(2)两台主机控制时

由于我们是接收方,所以上方框中的内容不需要知道,开启后,将电脑的ip号和端口号传给发送方即可。

  1. 程序代码

ServerControl

  1. using System.Collections.Generic;
  2. using UnityEngine.UI;
  3. using UnityEngine;
  4. using UnityEngine.Video;
  5. /// <summary>
  6. /// 服务接收生成
  7. /// </summary>
  8. public class ServerControl : MonoBehaviour
  9. {
  10. //public Transform prefab;
  11. public InputField field;
  12. public Button btn;
  13. public GameObject part1Root;
  14. public GameObject part2Root;
  15. void Start()
  16. {
  17. if (field.text != string.Empty)
  18. {
  19. UdpManager.InitializeUdpClient(int.Parse(field.text));
  20. }
  21. part1Root.SetActive(true);
  22. part2Root.SetActive(false);
  23. }
  24. void Update()
  25. {
  26. #region 1.0
  27. //if (UdpManager.m_receivedMessage != null)
  28. //{
  29. // string[] msgArr = UdpManager.m_receivedMessage.Split('_');
  30. // Debug.Log(msgArr[0]);
  31. // if (msgArr.Length > 0)
  32. // {
  33. // //创建预设体
  34. // Transform obj = Instantiate(PrefabList[int.Parse(msgArr[0])], parent);
  35. // obj.gameObject.SetActive(true);
  36. // Debug.Log("创建");
  37. // }
  38. // UdpManager.m_receivedMessage = null;
  39. //}
  40. #endregion
  41. #region 2.0
  42. if (UdpManager.m_receivedMessage != null)
  43. {
  44. string[] array = UdpManager.m_receivedMessage.Split(',');
  45. Debug.Log(UdpManager.m_receivedMessage);
  46. if (UdpManager.m_receivedMessage=="1")
  47. {
  48. part1Root.SetActive(true);
  49. part2Root.SetActive(false);
  50. }
  51. if (UdpManager.m_receivedMessage == "2")
  52. {
  53. part1Root.SetActive(false);
  54. part2Root.SetActive(true);
  55. }
  56. UdpManager.m_receivedMessage = null;
  57. //if (UdpManager.m_receivedMessage != null)
  58. //{
  59. // //创建预设体
  60. // transform.eulerAngles = new Vector3(float.Parse(array[0]), float.Parse(array[1]), float.Parse(array[2]));
  61. //}
  62. //UdpManager.m_receivedMessage = null;
  63. }
  64. #endregion
  65. }
  66. private void OnDestroy()
  67. {
  68. UdpManager.Close();
  69. }
  70. }

其中端口号也可以设置外部加载,本系统中设置的是在程序中修改

UdpManager

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading;
  9. using UnityEngine;
  10. using UnityEngine.Video;
  11. public class UdpManager
  12. {
  13. public static string m_receivedMessage;
  14. static IPEndPoint m_IPEndPoint;
  15. static UdpClient m_udpClient;
  16. public static void InitializeUdpClient(int Prot)
  17. {
  18. m_IPEndPoint = new IPEndPoint(IPAddress.Any, Prot);
  19. m_udpClient = new UdpClient(m_IPEndPoint);
  20. UdpModel s = new UdpModel(m_udpClient, m_IPEndPoint);
  21. m_udpClient.BeginReceive(EndReceive, s);
  22. Debug.Log("服务器启动");
  23. }
  24. //结束得到的信息
  25. private static void EndReceive(IAsyncResult ar)
  26. {
  27. try
  28. {
  29. UdpModel m_UdpModel = ar.AsyncState as UdpModel;
  30. if (m_UdpModel != null)
  31. {
  32. UdpClient udpClient = m_UdpModel.m_udpclient;
  33. IPEndPoint ip = m_UdpModel.m_ip;
  34. Byte[] receiveBytes = udpClient.EndReceive(ar, ref ip);
  35. string msg = Encoding.UTF8.GetString(receiveBytes);
  36. m_receivedMessage = msg;
  37. udpClient.BeginReceive(EndReceive, m_UdpModel); //开始获取
  38. }
  39. }
  40. catch (Exception ex)
  41. {
  42. //处理异常
  43. }
  44. }
  45. //udp模型
  46. private class UdpModel
  47. {
  48. public UdpClient m_udpclient = null;
  49. public IPEndPoint m_ip;
  50. public UdpModel(UdpClient udpclient, IPEndPoint ip)
  51. {
  52. this.m_udpclient = udpclient;
  53. this.m_ip = ip;
  54. }
  55. }
  56. //关闭
  57. public static void Close()
  58. {
  59. if (m_udpClient != null)
  60. {
  61. m_udpClient.Close();
  62. m_udpClient = null;
  63. }
  64. }
  65. /// <summary>
  66. /// 发送数据
  67. /// </summary>
  68. /// <param name="obj"></param>
  69. public static void SendMessage(string message)
  70. {
  71. UdpClient myUdpClient = new UdpClient();
  72. IPEndPoint endpoint;
  73. //当前服务器ip和端口号
  74. myUdpClient = new UdpClient(new IPEndPoint(IPAddress.Any, 8800));
  75. //要发送给的地址和端口号,255.255.255.255表示在这个局域网的所有ip
  76. endpoint = new IPEndPoint(IPAddress.Parse("192.168.31.174"), 1180);
  77. byte[] bytes = Encoding.UTF8.GetBytes(message);
  78. try
  79. {
  80. myUdpClient.Send(bytes, bytes.Length, endpoint);
  81. myUdpClient.Close();
  82. }
  83. catch (Exception err)
  84. {
  85. Console.Write(err.Message, "发送失败");
  86. }
  87. finally
  88. {
  89. myUdpClient.Close();
  90. }
  91. }
  92. }
  1. 自我测试控制程序

脚本挂载在摄像机上,开启程序,设置网络调试助手下方的ip和端口号,发送数据1时,播放视频1,发送数据2时,播放视频2。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/114130
推荐阅读
相关标签
  

闽ICP备14008679号