当前位置:   article > 正文

Unity实现UDP连接,做一个简单的UDP通讯_unity中udp

unity中udp

准备:

首先写一个UDP连接总类,这个类只管UDP的收和发代码如下:

  1. using System.Net;
  2. using System.Net.Sockets;
  3. using System.Text;
  4. using System.Threading;
  5. using UnityEngine;
  6. public class UDPManager
  7. {
  8. public string recvStr; //服务器返回值
  9. public string UDPClientAddRess = "127.0.0.1"; //目标服务器地址
  10. public int UDPClientPort = 1081; //目标服务器端口号
  11. Socket socket;
  12. EndPoint serverEnd;
  13. IPEndPoint ipEnd;
  14. byte[] recvData = new byte[1024];
  15. byte[] sendData = new byte[1024];
  16. int recvLen = 0;
  17. Thread connectThread;
  18. /// <summary>
  19. /// 想服务器发送数据
  20. /// </summary>
  21. /// <param name="message"></param>
  22. public void InitSocket(string message)
  23. {
  24. UDPClientAddRess = UDPClientAddRess.Trim();
  25. ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientAddRess), UDPClientPort);
  26. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  27. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
  28. serverEnd = sender;
  29. Debug.Log("等待链接");
  30. SocketSend(message);
  31. Debug.Log("连接成功");
  32. connectThread = new Thread(new ThreadStart(SocketReceve));
  33. connectThread.Start();
  34. }
  35. /// <summary>
  36. /// 想服务端发送需要发送的内容
  37. /// </summary>
  38. /// <param name="sendMessage"></param>
  39. void SocketSend(string sendMessage)
  40. {
  41. //首先清空所有
  42. sendData = new byte[1024];
  43. //转换数据
  44. sendData = Encoding.UTF8.GetBytes(sendMessage);
  45. //将数据发送到服务端
  46. socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
  47. }
  48. /// <summary>
  49. /// 接收来自服务端的消息
  50. /// </summary>
  51. void SocketReceve()
  52. {
  53. while (true)
  54. {
  55. recvData = new byte[1024];
  56. try
  57. {
  58. recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
  59. }
  60. catch (System.Exception e)
  61. {
  62. Debug.LogError("出现异常,异常信息:" + e);
  63. }
  64. Debug.Log("收到信息,信息来自:" + serverEnd.ToString());
  65. if (recvLen >0 )
  66. {
  67. recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
  68. Debug.Log(recvStr);
  69. }
  70. else
  71. {
  72. Debug.LogError("出现错误,请检查网络链接是否正常");
  73. }
  74. }
  75. }
  76. /// <summary>
  77. /// 关闭与服务器的连接
  78. /// </summary>
  79. public void SocketQuit()
  80. {
  81. //如果线程还在就需要关闭线程
  82. Debug.Log("销毁UDP");
  83. if(connectThread != null)
  84. {
  85. connectThread.Interrupt();
  86. connectThread.Abort();
  87. }
  88. //最后关闭socket
  89. if(socket != null)
  90. {
  91. socket.Close();
  92. }
  93. }
  94. }

我们所有的连接都要通过这个类进行连接

然后我们写一个类进行数据的发送

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SendMessage : MonoBehaviour
  5. {
  6. UDPManager udpMgr;
  7. // Start is called before the first frame update
  8. void Start()
  9. {
  10. udpMgr = new UDPManager();
  11. }
  12. public void Send()
  13. {
  14. udpMgr.InitSocket("这里输入你需要发送的内容");
  15. }
  16. /// <summary>
  17. /// 程序最后退出时销毁udp
  18. /// </summary>
  19. void OnDisable()
  20. {
  21. udpMgr.SocketQuit();
  22. }
  23. }

收到消息会打印出来

注意事项:

由于开启了一个新的线程,所以继承自MonoBehaviour的很多方法不能直接调用,需要自行想办法去解决,建议通过update判断值执行方法后初始化值,很多很多方法,看自己去发现,这里不再多讲,本博客会持续更新,目前为残次,很多东西都没有处理,装上勿喷 谢谢合作

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

闽ICP备14008679号