【转】unity开发:UDP socket网络连接

原博客:https://blog.csdn.net/u012234115/article/details/46483885

由于UDP是面向无连接的通信,所以实际上服务端和客户端是对等的,只不过服务端绑定了一个监听端口,而客户端每次都是自动分配的连接端口,其实也可以做成两边都绑定端口或者都不绑定端口的P2P模式。

以下UDP是同步模式


建立两个unity工程,编写脚本,挂到场景中。


服务端


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

客户端

    
    
    
    
  1. using UnityEngine;
  2. using System.Collections;
  3. //引入库
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. public class UdpClient: MonoBehaviour
  9. {
  10. string editString= "hello wolrd"; //编辑框文字
  11. //以下默认都是私有的成员
  12. Socket socket; //目标socket
  13. EndPoint serverEnd; //服务端
  14. IPEndPoint ipEnd; //服务端端口
  15. string recvStr; //接收的字符串
  16. string sendStr; //发送的字符串
  17. byte[] recvData= new byte[ 1024]; //接收的数据,必须为字节
  18. byte[] sendData= new byte[ 1024]; //发送的数据,必须为字节
  19. int recvLen; //接收的数据长度
  20. Thread connectThread; //连接线程
  21. //初始化
  22. void InitSocket()
  23. {
  24. //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
  25. ipEnd= new IPEndPoint(IPAddress.Parse( "127.0.0.1"), 8001);
  26. //定义套接字类型,在主线程中定义
  27. socket= new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
  28. //定义服务端
  29. IPEndPoint sender= new IPEndPoint(IPAddress.Any, 0);
  30. serverEnd=(EndPoint)sender;
  31. print( "waiting for sending UDP dgram");
  32. //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息
  33. SocketSend( "hello");
  34. //开启一个线程连接,必须的,否则主线程卡死
  35. connectThread= new Thread( new ThreadStart(SocketReceive));
  36. connectThread.Start();
  37. }
  38. void SocketSend(string sendStr)
  39. {
  40. //清空发送缓存
  41. sendData= new byte[ 1024];
  42. //数据类型转换
  43. sendData=Encoding.ASCII.GetBytes(sendStr);
  44. //发送给指定服务端
  45. socket.SendTo(sendData,sendData.Length,SocketFlags.None,ipEnd);
  46. }
  47. //服务器接收
  48. void SocketReceive()
  49. {
  50. //进入接收循环
  51. while( true)
  52. {
  53. //对data清零
  54. recvData= new byte[ 1024];
  55. //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
  56. recvLen=socket.ReceiveFrom(recvData, ref serverEnd);
  57. print( "message from: "+serverEnd.ToString()); //打印服务端信息
  58. //输出接收到的数据
  59. recvStr=Encoding.ASCII.GetString(recvData, 0,recvLen);
  60. print(recvStr);
  61. }
  62. }
  63. //连接关闭
  64. void SocketQuit()
  65. {
  66. //关闭线程
  67. if(connectThread!= null)
  68. {
  69. connectThread.Interrupt();
  70. connectThread.Abort();
  71. }
  72. //最后关闭socket
  73. if(socket!= null)
  74. socket.Close();
  75. }
  76. // Use this for initialization
  77. void Start()
  78. {
  79. InitSocket(); //在这里初始化
  80. }
  81. void OnGUI()
  82. {
  83. editString=GUI.TextField( new Rect( 10, 10, 100, 20),editString);
  84. if(GUI.Button( new Rect( 10, 30, 60, 20), "send"))
  85. SocketSend(editString);
  86. }
  87. // Update is called once per frame
  88. void Update()
  89. {
  90. }
  91. void OnApplicationQuit()
  92. {
  93. SocketQuit();
  94. }
  95. }
  • 指定连接的目标端口
  • 发送消息和接收消息

测试
本程序实现服务端接收客户端发送的消息,经处理后再发送回去。
【转】unity开发:UDP socket网络连接_第1张图片

【转】unity开发:UDP socket网络连接_第2张图片

其实关于tcp和udp通信的代码可以写成一个单独的类,这要可以灵活的加到unity不同的场景。

你可能感兴趣的:(转载)