当前位置:   article > 正文

unity-UDP服务器数据传输_unity麦克风语音udp实时传输

unity麦克风语音udp实时传输

这里有一个需求就是,在服务端发送数据到客户端,客户端来接受数据,客户端是在unity中,比如客户端可以是人,小车等,我可以通过服务端的数据来控制人或者车的行为 。

首先,我们需要建立一个udp服务器,udp是面向无连接的不可靠传输协议,传输速度快且可传输数据量很大。由于要与unity数据传输,我们使用C#来建立服务端和客户端。

我们首先需要设置IP和端口号,然后创建两个线程,一个是发送消息,一个是接收消息,为什么呢?这里需要说明一个概念,UDP是发送数据就是服务端,如果你也接收数据你同时也可以是客户端,因为它们每一个无论客户端还是服务端只需要一个套接字,服务端可以向特定的许多客户端发送数据。

 static Socket server;
 static void Main(string[] args)
    {
        server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001));//绑定端口号和IP
        Console.WriteLine("服务端已经开启");
        Thread t = new Thread(ReciveMsg);//开启接收消息线程
         t.Start();
         Thread t2 = new Thread(sendMsg);//开启发送消息线程
         t2.Start();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

接收数据ReciveMsg:

 static void ReciveMsg()
        {
            while (true)
            {
                EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
                byte[] buffer = new byte[1024]; 
                int length = server.ReceiveFrom(buffer, ref point);//接收数据报
                string message = Encoding.UTF8.GetString(buffer, 0, length);
                Console.WriteLine(point.ToString() + message);

            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

while(true)是为了建立一个死循环用于不停的接收数据而byte[1024]是一次传输的数据大小。

发送数据sendMsg:

 static void sendMsg()
        {
            EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);
            while (true)
            {
                string msg = Console.ReadLine();
                server.SendTo(Encoding.UTF8.GetBytes(msg), point);
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以看到,两个函数都是静态成员函数, 有如下特点:

  • 不能通过对象调用静态成员函数
  • 不与特定对象相关联,只能使用静态数据成员
  • 其他文件中可以定义相同名字的函数,不会发生冲突
  • 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

所以说,使用静态函数是有原因的,其次,如上面所示,我们发送和接收数据就相当于建立了一个服务端和客户端,我们使用的都是127.0.0.1,127.0.0.1/8整个都是环回地址,用来测试本机的TCP/IP协议栈,发往这段A类地址数据包不会出网卡,网络设备不会对其做路由。但是我们的端口号一个是8001,一个是8000,所以就可以区分谁是客户端谁是服务端。

对于传输来的message是我们在服务端输入的数据,我们可能需要对数据进行解析才能使用,比如,传来三个单精度浮点数,用逗号隔开,我们要分别提取这三个数字,改怎么做呢?

//定义一个数组来保存传输来的message。
 string message;
 string[] sArray=new string[100];

//在接收到message之后立即对其分片处理
 sArray = message.Split(',');

//我默认传来的都是三个数字。
            for (int i = 0; i < sArray.Length; i++)
            {
                if (i % 3 == 0)
                {
                    a =Convert.ToSingle(sArray[i]);
                }
                if (i % 3 == 1)
                {
                   b = Convert.ToSingle(sArray[i]);
                }
                if (i % 3 == 2)
                {
                  c= Convert.ToSingle(sArray[i]);
                }

            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

当然,传输的数据可能不是字符串这么简单,可能是图片,视频,三维模型等,我们需要根据其格式做出适当处理。

最终效果如下:
这里写图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号