using System.Collections; using System.Collections.Generic; using System.Net.Sockets; using System.Net; using System.Threading; using UnityEngine; using System.Text; using System.Net.NetworkInformation; using System; public class UdpConnect : SingleTon { public string editString = "hello wolrd"; //编辑框文字 //以下默认都是私有的成员 private Socket socket; //目标socket private EndPoint serverEnd; //服务端 private IPEndPoint ipEnd; //服务端端口 private string recvStr; //接收的字符串 private string sendStr; //发送的字符串 private byte[] recvData = new byte[1024]; //接收的数据,必须为字节 private byte[] sendData = new byte[1024]; //发送的数据,必须为字节 private int recvLen; //接收的数据长度 private Thread connectThread; //连接线程 public void InitSocket() { string ip = DataManager.Instance.RoomPersonsItem.ip; int port = int.Parse(DataManager.Instance.RoomPersonsItem.port); ip = "127.0.0.1"; port = 8899; ipEnd = new IPEndPoint(IPAddress.Parse(ip), port); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Bind(ipEnd); //ip = DataManager.Instance.RoomPersonsItem.ip; //port = int.Parse(DataManager.Instance.RoomPersonsItem.port); IPEndPoint sender = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4001); serverEnd = (EndPoint)sender; Debug.Log("waiting for sending UDP dgram"); //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息 //SocketSend("hello"); //开启一个线程连接,必须的,否则主线程卡死 connectThread = new Thread(new ThreadStart(SocketReceive)); connectThread.Start(); } public void InitSocket(string message) { //string ip = DataManager.Instance.RoomPersonsItem.ip; //int port = int.Parse( DataManager.Instance.RoomPersonsItem.port); //ip = ""; //port = 8899; //ipEnd = new IPEndPoint(IPAddress.Parse(ip), port); //socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //serverEnd = sender; //Debug.Log("等待链接"); //SocketSend(message); //Debug.Log("连接成功"); //connectThread = new Thread(new ThreadStart(SocketReceve)); //connectThread.Start(); } public void SocketSend(string sendStr) { //清空发送缓存 sendData = new byte[1024]; //数据类型转换 sendData = Encoding.ASCII.GetBytes(sendStr); //发送给指定服务端 socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd); } public void SocketSend(char[] sendStr) { //清空发送缓存 sendData = new byte[1024]; //数据类型转换 sendData = Encoding.ASCII.GetBytes(sendStr); //发送给指定服务端 socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd); } public void SocketSend(byte[] sendByte) { //清空发送缓存 sendData = new byte[1024]; //数据类型转换 sendData = sendByte; //发送给指定服务端 socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd); } char[] recvChar; void SocketReceive() { //进入接收循环 while (true) { //对data清零 recvData = new byte[1024]; //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值 recvLen = socket.ReceiveFrom(recvData, ref serverEnd); //Debug.Log("message from: " + serverEnd.ToString()); //打印服务端信息 //输出接收到的数据 recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen); //recvData = Encoding.ASCII.GetBytes(recvData, 0, recvLen); Debug.Log("我是客户端,接收到服务器的数据" + recvStr); if (recvStr.Contains("01")) { Debug.Log("01 心率"); } else if (recvStr.Contains("02")) { Debug.Log("02 呼吸次数"); if (DataManager.Instance.bodyNum.Count > 0) { var data = DataManager.Instance.bodyNum[0]; //ui.Init("呼吸次数:" + data.breathingNum); UIManager.Instance.ShowHint("呼吸次数:" + data.breathingNum); } } else if (recvStr.Contains("03")) { Debug.Log("03 体温"); } else if (recvStr.Contains("22")) { Debug.Log("22 瞳孔"); } else if (recvStr.Contains("25")) { Debug.Log("25 瞳孔对光反射"); } else if (recvStr.Contains("24")) { Debug.Log("24 功能眨眼"); } else if (recvStr.Contains("f2")) { Debug.Log("f2 气泵"); } Debug.Log("我是客户端,接收到服务器的数据" + recvData); //for (int i = 0; i < recvChar.Length; i++) //{ // var item = recvChar[i]; // //var temp = Convert.ToInt32(item.ToString(), 16); // //var temp = Convert.ToInt16(item.ToString()); // Debug.Log(recvChar[i] + "___"+ item); //} } } void SocketQuit() { //关闭线程 if (connectThread != null) { connectThread.Interrupt(); connectThread.Abort(); } //最后关闭socket if (socket != null) socket.Close(); } public void OnApplicationQuit() { SocketQuit(); } }