• unity UDP 通信


    客户端 接收端 :

    1. using System;
    2. using System.IO;
    3. using System.Collections;
    4. using System.Collections.Generic;
    5. using System.Net;
    6. using System.Net.Sockets;
    7. using System.Text;
    8. using System.Threading;
    9. using UnityEngine;
    10. using UnityEngine.UI;
    11. public class UDPServer : MonoBehaviour
    12. {
    13. //以下默认都是私有的成员
    14. Socket socket;//目标socket
    15. EndPoint clientEnd;//客户端IP
    16. EndPoint ipEnd;//侦听端口
    17. public string recvStr; //接收的字符串
    18. string sendStr;//发送的字符串
    19. byte[] recvData = new byte[1024];//接收的数据,必须为字节
    20. byte[] sendData = new byte[1024];//发送的数据,必须为字节
    21. int recvLen;//接收的数据长度
    22. Thread connectThread;//连接线程
    23. // Start is called before the first frame update
    24. void Start()
    25. {
    26. InitSocket();
    27. }
    28. private void OnApplicationQuit()
    29. {
    30. SocketQuit();
    31. }
    32. // Update is called once per frame
    33. void Update()
    34. {
    35. //监听接受数据
    36. switch (recvStr)
    37. {
    38. //接收到的数据
    39. case "":
    40. //事件
    41. break;
    42. }
    43. }
    44. void InitSocket()
    45. {
    46. // 定义侦听端口,侦听任何IP 自定义端口号和服务端保持一致
    47. ipEnd = new IPEndPoint(IPAddress.Any, 8883);//定义套接字类型,在主线程中定义
    48. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//服务端需要绑定ip
    49. socket.Bind(ipEnd);//定义客户端
    50. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 8880);//自定义端口号 发送给别的某个电脑的 这台电脑的端口号
    51. clientEnd = (EndPoint)sender;
    52. //print("waiting for UDP dgram");
    53. //开启一个线程连接,必须的,否则主线程卡死
    54. connectThread = new Thread(new ThreadStart(SocketReceive));
    55. connectThread.Start();
    56. }
    57. public void SocketSend(string sendStr)
    58. {
    59. //清空发送缓存
    60. sendData = new byte[1024];//数据类型转换
    61. sendData = Encoding.UTF8.GetBytes(sendStr);//发送给指定客户端
    62. socket.SendTo(sendData, sendData.Length, SocketFlags.None, clientEnd);
    63. }
    64. void SocketReceive()
    65. {
    66. //进入接收循环
    67. while (true)
    68. {
    69. //data清零
    70. recvData = new byte[1024];
    71. //获取客户端,获取客户端数据,用引用给客户端赋值
    72. recvLen = socket.ReceiveFrom(recvData, ref clientEnd);
    73. //print("message from:" + clientEnd.ToString());//打印客户端信息
    74. // 输出接收到的数据
    75. recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen);
    76. print("我是服务器,接收到客户端的数据" + recvStr);
    77. //将接收到的数据经过处理再发送出去
    78. sendStr = "From Server333: " + recvStr;
    79. SocketSend(sendStr);
    80. //ProcessInformation(recvStr);
    81. // Debug.Log(sendStr);
    82. }
    83. }
    84. //连接关闭
    85. void SocketQuit()
    86. {
    87. //关闭线程
    88. if (connectThread != null)
    89. {
    90. connectThread.Interrupt();
    91. connectThread.Abort();
    92. }
    93. // 最后关闭socket
    94. if (socket != null)
    95. socket.Close();
    96. print("disconnect-1");
    97. }
    98. }

    服务器 发送端 :

    1. using UnityEngine;
    2. using UnityEngine.UI;
    3. using System.Collections;
    4. using System;
    5. using System.IO;
    6. using System.Net;
    7. using System.Net.Sockets;
    8. using System.Text;
    9. using System.Threading;
    10. //服务器 发送端
    11. public class UDPClient : MonoBehaviour
    12. {
    13. public string recvStr;
    14. private string UDPClientIP;
    15. Socket socket;
    16. EndPoint serverEnd;
    17. IPEndPoint ipEnd;
    18. byte[] recvData = new byte[1024];
    19. byte[] sendData = new byte[1024];
    20. int recvLen = 0;
    21. Thread connectThread;
    22. private void Awake()
    23. {
    24. }
    25. void Start()
    26. {
    27. //IP地址
    28. UDPClientIP = "192.168.1.16";//自己电脑的ip地址
    29. UDPClientIP = UDPClientIP.Trim();
    30. InitSocket();
    31. }
    32. //ipEnd = new IPEndPoint(IP地址,端口号);
    33. //这里用json读取配置方便外部修改
    34. void InitSocket()
    35. {
    36. ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), 8880);// 后面的端口是接收端的端口号
    37. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    38. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    39. serverEnd = (EndPoint)sender;
    40. //开启一个线程连接
    41. connectThread = new Thread(new ThreadStart(SocketReceive));
    42. connectThread.Start();
    43. }
    44. //可以绑定Button发送string类型信息
    45. public void SocketSend(string sendStr)
    46. {
    47. //清空
    48. sendData = new byte[1024];
    49. //数据转换
    50. sendData = Encoding.UTF8.GetBytes(sendStr);
    51. //发送给指定服务端
    52. socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
    53. }
    54. //接收服务器信息
    55. void SocketReceive()
    56. {
    57. while (true)
    58. {
    59. recvData = new byte[1024];
    60. try
    61. {
    62. recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
    63. }
    64. catch (Exception e)
    65. {
    66. }
    67. //print("信息来自: " + serverEnd.ToString());
    68. if (recvLen > 0)
    69. {
    70. recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
    71. print(recvStr);
    72. }
    73. }
    74. }
    75. //连接关闭
    76. void SocketQuit()
    77. {
    78. //关闭线程
    79. if (connectThread != null)
    80. {
    81. connectThread.Interrupt();
    82. connectThread.Abort();
    83. }
    84. //最后关闭socket
    85. if (socket != null)
    86. socket.Close();
    87. }
    88. void OnApplicationQuit()
    89. {
    90. SocketQuit();
    91. }
    92. void Update()
    93. {
    94. if (Input.GetKeyDown(KeyCode.K))
    95. {
    96. SocketSend("ddddd");
    97. }
    98. }
    99. }

  • 相关阅读:
    【Segment Anything Model】八:修改SAM源码做分类任务
    表单与列表在HTML与CSS中是这么玩的
    百度之星(夏日漫步)
    基于InsightFace的高精度人脸识别,可直接对标虹软
    C语言:文件操作(1)
    day 1 704 二分查找、27 移除元素 3de10a93119644fab12fdc47cbff2d1d
    基于SSM的车辆租赁管理系统
    Flutter查漏补缺1
    【lwip】04-网络数据包流向
    红帽官宣新任总裁兼 CEO!转型关键人物 Paul Cormier “退而不休”
  • 原文地址:https://blog.csdn.net/gao7009/article/details/132896159