//face_fit_msg face_data_recv; private void Awake() { byte[] buffer = new byte[Marshal.SizeOf(new face_fit_msg())]; face_fit_msg face_data_temp = Bytes2Struct <face_fit_msg>(buffer); face_fit.face_data_recv = Bytes2Struct <face_fit_msg>(buffer); }
private void StartServer() { const int bufferSize = 8192;//缓存大小,8192字节 IPAddress ip = IPAddress.Parse("192.168.177.111"); TcpListener tlistener = new TcpListener(ip, 6666); tlistener.Start(); Debug.Log("Socket服务器监听启动......"); byte[] buffer = new byte[bufferSize * 2];//定义一个缓存buffer数组 byte[] buffer_small = new byte[1024]; do { try //直接关掉客户端,服务器端会抛出异常 { TcpClient remoteClient = tlistener.AcceptTcpClient(); //接收已连接的客户端,阻塞方法 //Debug.Log("客户端已连接!local:" + remoteClient.Client.LocalEndPoint + "<---Client:" + remoteClient.Client.RemoteEndPoint); NetworkStream streamToClient = remoteClient.GetStream(); //获得来自客户端的流 int byteRead = 0; int small_packet_size = 0; while (true) { byteRead += streamToClient.Read(buffer, small_packet_size, 1781 * 5);//将数据搞入缓存中(有朋友说read()是阻塞方法,测试中未发现程序阻塞) //Debug.Log("byteRead : " + byteRead); //int byteRead2 = streamToClient.Read(buffer_small, 0, 1024); if (byteRead == 0) //连接断开,或者在TCPClient上调用了Close()方法,或者在流上调用了Dispose()方法。 { Debug.Log("客户端连接断开......"); // It seems useless... //break; return; } if (byteRead < 1781) { small_packet_size = byteRead; //Debug.Log("packet size : " + byteRead); continue; } small_packet_size = 0; //receive complete //if( byteRead < 1781) //{ // //Debug.Log("package is still reciveing"); // Debug.Log("byteRead: " + byteRead); // //Debug.Log("raw data: " + BitConverter.ToString(buffer)); // continue; //} //接收客户端发送的数据部分 //Debug.Log("byteRead: " + byteRead + "byteRead2 " + byteRead2); //buffer_small.CopyTo(buffer, 1460); //Debug.Log("raw data: " + BitConverter.ToString(buffer)); int package_size = Marshal.SizeOf(new face_fit_msg()); //int package_num = (byteRead + byteRead2) / package_size; int package_num = (byteRead) / package_size; //Debug.Log("face_fit_msg size :" + package_num); for (int i = 0; i < package_num; ++i) { byte[] each_struct = new byte[package_size]; Array.Copy(buffer, i * package_size, each_struct, 0, package_size); //Debug.Log("package length: " + each_struct.Length + '\n' + BitConverter.ToString(each_struct)); //Debug.Log("msg length :" + byteRead); // data check face_data_temp = Bytes2Struct <face_fit_msg>(each_struct); if (BitConverter.ToString(packages_head_check) == BitConverter.ToString(face_data_temp.packages_head) && BitConverter.ToString(packages_end_check) == BitConverter.ToString(face_data_temp.package_end)) // low efficiency { //Debug.Log("check success"); face_fit.face_data_recv = Bytes2Struct <face_fit_msg>(each_struct); } face_fit.face_data_recv.face_fit_data[170] = 66; //check each head and end //if check successfully, then do next operation. //Debug.Log("package_size: " + package_size); //Debug.Log("package head : " + BitConverter.ToString(face_fit.face_data_recv.packages_head)); //Debug.Log("face-fit data: " + face_fit.face_data_recv.face_fit_data[132] + ' ' // + face_fit.face_data_recv.face_fit_data[133] + ' ' // + face_fit.face_data_recv.face_fit_data[134] + ' ' // ); ////+face_fit.face_data_recv.face_fit_data[132] + ' ' //// + face_fit.face_data_recv.face_fit_data[133] + ' ' //// + face_fit.face_data_recv.face_fit_data[134] //Debug.Log("package end : " + BitConverter.ToString(face_fit.face_data_recv.package_end)); buffer = new byte[bufferSize * 2]; } break; // string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法 //string msg = Encoding.ASCII.GetString(buffer, 0, byteRead);// 直接接受字符串 //Debug.Log("接收数据:" + msg + ".数据长度:[" + byteRead + "byte]"); } } catch (Exception ex) { Debug.Log("客户端异常:" + ex.Message); break; } }while (true); }