赞
踩
这里有一个需求就是,在服务端发送数据到客户端,客户端来接受数据,客户端是在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();
}
接收数据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);
}
}
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);
}
可以看到,两个函数都是静态成员函数, 有如下特点:
所以说,使用静态函数是有原因的,其次,如上面所示,我们发送和接收数据就相当于建立了一个服务端和客户端,我们使用的都是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]);
}
}
当然,传输的数据可能不是字符串这么简单,可能是图片,视频,三维模型等,我们需要根据其格式做出适当处理。
最终效果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。