在unity中使用UDP进行数据的交互,建立C/S模式,两个客户端和一个服务端。两个客户端使用不同的端口往服务端发送数据,服务端根据收到的数据进行处理和判断,控制服务端的显示。
说明:两个客户端连接的是Kinect V2,需要将检测到的人体的数据信息发送到服务端进行系统数据的整体显示。指定的消息协议是ClientID|index|PosLeft|Left_S|PosRight|Right_S|ACTION| ClientID|index|PosLeft|Left_S|PosRight|Right_S|ACTION| ...
这是客户端根据检测到人体的数量向服务端发送的数据格式。
服务端:使用两个线程用于接收两个客户端的数据,将收到的数据添加到Queue中。在需要显示数据的Update中从Queue中取出数据进行处理控制。
这里服务端的接收数据脚本直接上代码:
using UnityEngine;
using System.Collections;
//引入库
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Collections.Generic;
public class UdpHelpHandler : MonoBehaviour {
//以下默认都是私有的成员
Socket socket,socket2; //目标socket
EndPoint clientEnd; //客户端
IPEndPoint ipEnd,ipEnd2; //侦听端口
string recvStr,recvStr2; //接收的字符串
string sendStr; //发送的字符串
byte[] recvData=new byte[1024]; //接收的数据,必须为字节
byte[] recvData2=new byte[1024]; //接收的数据,必须为字节
byte[] sendData=new byte[1024]; //发送的数据,必须为字节
int recvLen,recvLen2; //接收的数据长度
Thread connectThread,connectThread2; //连接线程
int[] WaveCounts = new int[2];
int[] TPoseCounts = new int[2];
public Queue<string> queueClient1 = new Queue<string>();
public Queue<string> queueClient2 = new Queue<string>();
private System.Object thisLock = new System.Object ();
//初始化
public void InitSocket()
{
//定义侦听端口,侦听任何IP
ipEnd=new IPEndPoint(IPAddress.Any,2000);
//定义套接字类型,在主线程中定义
socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//服务端需要绑定ip
try{
socket.Bind(ipEnd);
}
catch (System.Exception ex)
{
socket.Close ();
Debug.LogError(ex.Message + "\n" + ex.StackTra