コード例 #1
0
ファイル: NetClient.cs プロジェクト: wuhuolong/MaxBooks
        /// <summary>
        /// 进行多包的解析
        /// </summary>
        /// <param name="body"></param>
        /// <param name="compress"></param>
        /// <param name="len"></param>
        protected void ParseMutiPack(byte[] body, bool compress, int len)
        {
            // 多包整体解密
            if (mEncrypt != null)
            {
                mEncrypt.RecvDecode(body, len);
            }

            int decompress_size = 0;// 解压后的数据大小

            byte[] decompress_date = null;
            if (compress)
            {
                if (mDecompress == null)
                {
                    mDecompress = LZ4Sharp.LZ4DecompressorFactory.CreateNew();
                }

                decompress_size = mDecompress.Decompress(body, 0, mDecompressBuffer, 0, len);
                decompress_date = mDecompressBuffer;
            }
            else
            {
                decompress_size = len;
                decompress_date = body;
            }

            int remain_buf = decompress_size;
            int cur_idx    = 0;

            while (cur_idx < remain_buf)
            {
                ushort sinle_pack_len = Utils.BitConverter.ToUInt16(decompress_date, cur_idx);
                OnDataReply(decompress_date, cur_idx + sizeof(ushort), sinle_pack_len);

                cur_idx += (sinle_pack_len + sizeof(ushort));
            }
        }
コード例 #2
0
    void Update()
    {
        int recHostId;
        int connectionId;
        int recChannelId;
        int dataSize;

        // enable play mode if needed
        if (manager && manager.IsInitialized() && !manager.IsPlayModeEnabled())
        {
            manager.EnablePlayMode(true);
        }

        // connect after broadcast discovery, if needed
        if (clientConnId < 0 && serverHost != string.Empty && serverHost != "0.0.0.0" && serverPort != 0)
        {
            Start();
        }

        try
        {
            byte error = 0;

            // disconnect if no data received for the last 10 seconds
            if (connected && (Time.time - dataReceivedAt) >= 10f)
            {
                NetworkTransport.Disconnect(clientHostId, clientConnId, out error);
                dataReceivedAt = Time.time;

                if (error != (byte)NetworkError.Ok)
                {
                    throw new UnityException("Disconnect: " + (NetworkError)error);
                }
            }

            if (connected && keepAliveIndex < keepAliveCount)
            {
                if (sendKeepAlive[keepAliveIndex] && !string.IsNullOrEmpty(keepAliveData[keepAliveIndex]))
                {
                    // send keep-alive to the server
                    sendKeepAlive[keepAliveIndex] = false;
                    byte[] btSendMessage = System.Text.Encoding.UTF8.GetBytes(keepAliveData[keepAliveIndex]);

                    int compSize = 0;
                    if (compressor != null && btSendMessage.Length >= 100)
                    {
                        compSize = compressor.Compress(btSendMessage, 0, btSendMessage.Length, compressBuffer, 0);
                    }
                    else
                    {
                        System.Buffer.BlockCopy(btSendMessage, 0, compressBuffer, 0, btSendMessage.Length);
                        compSize = btSendMessage.Length;
                    }

                    NetworkTransport.Send(clientHostId, clientConnId, clientChannelId, compressBuffer, compSize, out error);
                    //Debug.Log(clientConnId + "-keep: " + keepAliveData[keepAliveIndex]);

                    if (error != (byte)NetworkError.Ok)
                    {
                        throw new UnityException("Keep-alive: " + (NetworkError)error);
                    }

                    // make sure sr-message is sent just once
                    if (keepAliveIndex == 0 && keepAliveData[0].IndexOf(",sr") >= 0)
                    {
                        RemoveResponseMsg(",sr");
                    }
                }

                keepAliveIndex++;
                if (keepAliveIndex >= keepAliveCount)
                {
                    keepAliveIndex = 0;
                }
            }

            // get next receive event
            NetworkEventType recData;

            if (serverHost != string.Empty && serverHost != "0.0.0.0" && serverPort != 0)
            {
                recData = NetworkTransport.ReceiveFromHost(clientHostId, out connectionId, out recChannelId, recBuffer, bufferSize, out dataSize, out error);
            }
            else
            {
                recData = NetworkTransport.Receive(out recHostId, out connectionId, out recChannelId, recBuffer, bufferSize, out dataSize, out error);                  // wait for broadcast
            }
            switch (recData)
            {
            case NetworkEventType.Nothing:
                break;

            case NetworkEventType.ConnectEvent:
                if (connectionId == clientConnId)
                {
                    connected = true;
                    //connectedOnce = true;

                    disconnectedAt = 0f;
                    dataReceivedAt = Time.time;
                    //sendKeepAlive = false;

                    Debug.Log("Connected.");

                    if (statusText)
                    {
                        statusText.text = "Connected.";
                    }
                }
                break;

            case NetworkEventType.DataEvent:
                if (connectionId == clientConnId)
                {
                    if (error != (byte)NetworkError.Ok)
                    {
                        Debug.Log("Receive error on connection " + connectionId + ": " + (NetworkError)error);
                    }
                    else
                    {
                        dataReceivedAt = Time.time;
                        //sendKeepAlive = true;

                        //string sRecvMessage = System.Text.Encoding.UTF8.GetString(recBuffer, 0, dataSize);
                        int decompSize = 0;
                        if (decompressor != null && (recBuffer[0] > 127 || recBuffer[0] < 32))
                        {
                            decompSize = decompressor.Decompress(recBuffer, 0, compressBuffer, 0, dataSize);
                        }
                        else
                        {
                            System.Buffer.BlockCopy(recBuffer, 0, compressBuffer, 0, dataSize);
                            decompSize = dataSize;
                        }

                        string sRecvMessage = System.Text.Encoding.UTF8.GetString(compressBuffer, 0, decompSize);

//						if(sRecvMessage.StartsWith("pv"))
//						{
//							//Debug.Log("Got part face verts - " + sRecvMessage.Substring(0, 3));
//
//							// part of face-vertices msg
//							sRecvMessage = ProcessPvMessage(sRecvMessage);
//
//							if(sRecvMessage.Length == 0)
//								EnableNextKeepAlive(2);
//						}
//						else if(sRecvMessage.StartsWith("pt"))
//						{
//							//Debug.Log("Got part face tris - " + sRecvMessage.Substring(0, 3));
//
//							// part of face-triangles msg
//							sRecvMessage = ProcessPtMessage(sRecvMessage);
//
//							if(sRecvMessage.Length == 0)
//								EnableNextKeepAlive(3);
//						}

                        if (!string.IsNullOrEmpty(sRecvMessage))
                        {
                            char[]   msgDelim   = { '|' };
                            string[] asMessages = sRecvMessage.Split(msgDelim);

                            char[] partDelim = { ',' };
                            for (int i = 0; i < asMessages.Length; i++)
                            {
                                if (manager && asMessages[i].Length > 3)
                                {
                                    if (asMessages[i].StartsWith("kb,"))
                                    {
                                        //Debug.Log("Got body data");
                                        manager.SetBodyFrameData(asMessages[i]);
                                        EnableNextKeepAlive(0);
                                    }
                                    else if (asMessages[i].StartsWith("kh,"))
                                    {
                                        manager.SetBodyHandData(asMessages[i]);
                                    }
                                    else if (asMessages[i].StartsWith("km,"))
                                    {
                                        manager.SetWorldMatrixData(asMessages[i]);
                                    }
                                    else if (asMessages[i].StartsWith("vg,") && gestureManager != null)
                                    {
                                        gestureManager.SetGestureDataFromCsv(asMessages[i], partDelim);
                                    }
                                    else if (asMessages[i].StartsWith("sr,") && speechManager != null)
                                    {
                                        speechManager.SetSpeechDataFromCsv(asMessages[i], partDelim);
                                    }
//									else if(asMessages[i].StartsWith("fp,") && faceManager != null)
//									{
//										//Debug.Log("Got face params");
//										faceManager.SetFaceParamsFromCsv(asMessages[i]);
//										EnableNextKeepAlive(1);
//									}
//									else if(asMessages[i].StartsWith("fv,") && faceManager != null)
//									{
//										//Debug.Log("Got face vertices");
//										faceManager.SetFaceVerticesFromCsv(asMessages[i]);
//										EnableNextKeepAlive(2);
//									}
//									else if(asMessages[i].StartsWith("fu,") && faceManager != null)
//									{
//										//Debug.Log("Got face uvs");
//										faceManager.SetFaceUvsFromCsv(asMessages[i]);
//										EnableNextKeepAlive(2);
//									}
//									else if(asMessages[i].StartsWith("ft,") && faceManager != null)
//									{
//										//Debug.Log("Got face triangles");
//										faceManager.SetFaceTrianglesFromCsv(asMessages[i]);
//
//										keepAliveData[3] = null;  // clear index 3 - one set of tris is enough
//										EnableNextKeepAlive(3);
//									}
                                }
                            }
                        }
                    }
                }
                break;

            case NetworkEventType.DisconnectEvent:
                if (connectionId == clientConnId)
                {
                    connected = false;
                    //connectedOnce = true;  // anyway, try to reconnect

                    disconnectedAt = Time.time;
                    dataReceivedAt = 0f;
                    //sendKeepAlive = false;

                    Debug.Log("Disconnected: " + (NetworkError)error);

                    if (error != (byte)NetworkError.Ok)
                    {
                        throw new UnityException("Disconnected: " + (NetworkError)error);
                    }
                }
                break;

            case NetworkEventType.BroadcastEvent:
                int receivedSize;
                NetworkTransport.GetBroadcastConnectionMessage(bcastHostId, bcastBuffer, bcastBuffer.Length, out receivedSize, out error);

                string senderAddr;
                int    senderPort;
                NetworkTransport.GetBroadcastConnectionInfo(bcastHostId, out senderAddr, out senderPort, out error);

                if (serverHost == string.Empty || serverHost == "0.0.0.0" || serverPort == 0)
                {
                    string sData = System.Text.Encoding.UTF8.GetString(bcastBuffer, 0, bcastBuffer.Length).Trim();
                    OnReceivedBroadcast(senderAddr, sData);
                }
                break;
            }

            // try to reconnect, if disconnected
            if (!connected && /**connectedOnce &&*/ disconnectedAt > 0f && (Time.time - disconnectedAt) >= reconnectAfter)
            {
                disconnectedAt = 0f;

                error        = 0;
                clientConnId = NetworkTransport.Connect(clientHostId, serverHost, serverPort, 0, out error);

                if (error == (byte)NetworkError.Ok)
                {
                    Debug.Log("Reconnecting to the server - " + serverHost + ":" + serverPort);

                    if (statusText)
                    {
                        statusText.text = "Reconnecting to the server...";
                    }
                }
                else
                {
                    throw new UnityException("Error while reconnecting: " + (NetworkError)error);
                }
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.Message + "\n" + ex.StackTrace);

            if (statusText)
            {
                statusText.text = ex.Message;
            }
        }
    }
コード例 #3
0
    void Update()
    {
        int recHostId;
        int connectionId;
        int recChannelId;
        int dataSize;

        bool connListUpdated = false;

        if (backgroundImage && backgroundImage.texture == null)
        {
            backgroundImage.texture = manager ? manager.GetUsersLblTex() : null;
        }

        if (faceManager == null)
        {
            faceManager = FacetrackingManager.Instance;
        }

        if (gestureManager == null)
        {
            gestureManager = VisualGestureManager.Instance;
        }

        if (speechManager == null)
        {
            speechManager = SpeechManager.Instance;
        }

        try
        {
            byte             error   = 0;
            NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out recChannelId, recBuffer, bufferSize, out dataSize, out error);

            switch (recData)
            {
            case NetworkEventType.Nothing:                     //1
                break;

            case NetworkEventType.ConnectEvent:                //2
                if (recHostId == serverHostId && recChannelId == serverChannelId &&
                    !dictConnection.ContainsKey(connectionId))
                {
                    HostConnection conn = new HostConnection();
                    conn.hostId       = recHostId;
                    conn.connectionId = connectionId;
                    conn.channelId    = recChannelId;
                    conn.keepAlive    = true;
                    conn.reqDataType  = "ka,kb,km,kh";
                    //conn.matrixSent = false;

                    dictConnection[connectionId] = conn;
                    connListUpdated = true;

                    //LogToConsole(connectionId + "-conn: " + conn.reqDataType);
                }

//				// reset chunked face messages
//				sendFvMsg = string.Empty;
//				sendFvNextOfs = 0;
//
//				sendFtMsg = string.Empty;
//				sendFtNextOfs = 0;
                break;

            case NetworkEventType.DataEvent:                   //3
                if (recHostId == serverHostId && recChannelId == serverChannelId &&
                    dictConnection.ContainsKey(connectionId))
                {
                    HostConnection conn = dictConnection[connectionId];

                    int decompSize = 0;
                    if (decompressor != null && (recBuffer[0] > 127 || recBuffer[0] < 32))
                    {
                        decompSize = decompressor.Decompress(recBuffer, 0, compressBuffer, 0, dataSize);
                    }
                    else
                    {
                        System.Buffer.BlockCopy(recBuffer, 0, compressBuffer, 0, dataSize);
                        decompSize = dataSize;
                    }

                    string sRecvMessage = System.Text.Encoding.UTF8.GetString(compressBuffer, 0, decompSize);

                    if (sRecvMessage.StartsWith("ka"))
                    {
                        if (sRecvMessage == "ka")                         // vr-examples v1.0 keep-alive message
                        {
                            sRecvMessage = "ka,kb,km,kh";
                        }

                        conn.keepAlive               = true;
                        conn.reqDataType             = sRecvMessage;
                        dictConnection[connectionId] = conn;

                        //LogToConsole(connectionId + "-recv: " + conn.reqDataType);

                        // check for SR phrase-reset
                        int iIndexSR = sRecvMessage.IndexOf(",sr");
                        if (iIndexSR >= 0 && speechManager)
                        {
                            speechManager.ClearPhraseRecognized();
                            //LogToConsole("phrase cleared");
                        }
                    }
                }
                break;

            case NetworkEventType.DisconnectEvent:             //4
                if (dictConnection.ContainsKey(connectionId))
                {
                    dictConnection.Remove(connectionId);
                    connListUpdated = true;
                }
                break;
            }

            if (connListUpdated)
            {
                // get all connection IDs
                alConnectionId.Clear();
                alConnectionId.AddRange(dictConnection.Keys);

                // display the number of connections
                StringBuilder sbConnStatus = new StringBuilder();
                sbConnStatus.AppendFormat("Server running: {0} connection(s)", dictConnection.Count);

                foreach (int connId in dictConnection.Keys)
                {
                    HostConnection conn = dictConnection[connId];
                    int            iPort = 0; string sAddress = string.Empty; NetworkID network; NodeID destNode;

                    NetworkTransport.GetConnectionInfo(conn.hostId, conn.connectionId, out sAddress, out iPort, out network, out destNode, out error);
                    if (error == (int)NetworkError.Ok)
                    {
                        sbConnStatus.AppendLine().Append("    ").Append(sAddress).Append(":").Append(iPort);
                    }
                }

                LogToConsole(sbConnStatus.ToString());

                if (connStatusText)
                {
                    connStatusText.text = sbConnStatus.ToString();
                }
            }

            // send body frame to available connections
            const char delimiter  = ',';
            string     sBodyFrame = manager ? manager.GetBodyFrameData(ref liRelTime, ref fCurrentTime, delimiter) : string.Empty;

            if (sBodyFrame.Length > 0 && dictConnection.Count > 0)
            {
                StringBuilder sbSendMessage        = new StringBuilder();
                bool          bFaceParamsRequested = IsFaceParamsRequested();

                sbSendMessage.Append(manager.GetWorldMatrixData(delimiter)).Append('|');
                sbSendMessage.Append(sBodyFrame).Append('|');
                sbSendMessage.Append(manager.GetBodyHandData(ref liRelTime, delimiter)).Append('|');

                if (bFaceParamsRequested && faceManager && faceManager.IsFaceTrackingInitialized())
                {
                    sbSendMessage.Append(faceManager.GetFaceParamsAsCsv(delimiter)).Append('|');
                }

                if (gestureManager && gestureManager.IsVisualGestureInitialized())
                {
                    sbSendMessage.Append(gestureManager.GetGestureDataAsCsv(delimiter)).Append('|');
                }

                if (speechManager && speechManager.IsSapiInitialized())
                {
                    sbSendMessage.Append(speechManager.GetSpeechDataAsCsv(delimiter)).Append('|');
                }

                if (sbSendMessage.Length > 0 && sbSendMessage[sbSendMessage.Length - 1] == '|')
                {
                    sbSendMessage.Remove(sbSendMessage.Length - 1, 1);
                }

                byte[] btSendMessage = System.Text.Encoding.UTF8.GetBytes(sbSendMessage.ToString());

                //Debug.Log("Message " + sbSendMessage.Length + " chars: " + sbSendMessage.ToString());
                //Debug.Log("Encoded into " + btSendMessage.Length + " bytes: " + ByteArrayToString(btSendMessage, btSendMessage.Length));

                int compSize = 0;
                if (compressor != null && btSendMessage.Length > 100 && !websocketHost)
                {
                    compSize = compressor.Compress(btSendMessage, 0, btSendMessage.Length, compressBuffer, 0);
                }
                else
                {
                    System.Buffer.BlockCopy(btSendMessage, 0, compressBuffer, 0, btSendMessage.Length);
                    compSize = btSendMessage.Length;
                }

                //Debug.Log("Compressed into " + compSize + " bytes: " + ByteArrayToString(compressBuffer, compSize));

//				// check face-tracking requests
//				bool bFaceParams = false, bFaceVertices = false, bFaceUvs = false, bFaceTriangles = false;
//				if(faceManager && faceManager.IsFaceTrackingInitialized())
//					CheckFacetrackRequests(out bFaceParams, out bFaceVertices, out bFaceUvs, out bFaceTriangles);
//
//				byte[] btFaceParams = null;
//				if(bFaceParams)
//				{
//					string sFaceParams = faceManager.GetFaceParamsAsCsv();
//					if(!string.IsNullOrEmpty(sFaceParams))
//						btFaceParams = System.Text.Encoding.UTF8.GetBytes(sFaceParams);
//				}
//
//				// next chunk of data for face vertices
//				byte[] btFaceVertices = null;
//				string sFvMsgHead = string.Empty;
//				GetNextFaceVertsChunk(bFaceVertices, bFaceUvs, ref btFaceVertices, out sFvMsgHead);
//
//				// next chunk of data for face triangles
//				byte[] btFaceTriangles = null;
//				string sFtMsgHead = string.Empty;
//				GetNextFaceTrisChunk(bFaceTriangles, ref btFaceTriangles, out sFtMsgHead);

                foreach (int connId in alConnectionId)
                {
                    HostConnection conn = dictConnection[connId];

                    if (conn.keepAlive)
                    {
                        conn.keepAlive         = false;
                        dictConnection[connId] = conn;

                        if (conn.reqDataType != null && conn.reqDataType.Contains("kb,"))
                        {
                            //LogToConsole(conn.connectionId + "-sendkb: " + conn.reqDataType);

                            error = 0;
                            //if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btSendMessage, btSendMessage.Length, out error))
                            if (!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, compressBuffer, compSize, out error))
                            {
                                string sMessage = "Error sending body data via conn " + conn.connectionId + ": " + (NetworkError)error;
                                LogErrorToConsole(sMessage);

                                if (serverStatusText)
                                {
                                    serverStatusText.text = sMessage;
                                }
                            }
                        }

//						if(bFaceParams && btFaceParams != null &&
//							conn.reqDataType != null && conn.reqDataType.Contains("fp,"))
//						{
//							//Debug.Log(conn.connectionId + "-sendfp: " + conn.reqDataType);
//
//							error = 0;
//							if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btFaceParams, btFaceParams.Length, out error))
//							{
//								string sMessage = "Error sending face params via conn " + conn.connectionId + ": " + (NetworkError)error;
//								Debug.LogError(sMessage);
//
//								if(serverStatusText)
//								{
//									serverStatusText.text = sMessage;
//								}
//							}
//						}
//
//						if(bFaceVertices && btFaceVertices != null &&
//							conn.reqDataType != null && conn.reqDataType.Contains("fv,"))
//						{
//							//Debug.Log(conn.connectionId + "-sendfv: " + conn.reqDataType + " - " + sFvMsgHead);
//
//							error = 0;
//							if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btFaceVertices, btFaceVertices.Length, out error))
//							{
//								string sMessage = "Error sending face verts via conn " + conn.connectionId + ": " + (NetworkError)error;
//								Debug.LogError(sMessage);
//
//								if(serverStatusText)
//								{
//									serverStatusText.text = sMessage;
//								}
//							}
//						}
//
//						if(bFaceTriangles && btFaceTriangles != null &&
//							conn.reqDataType != null && conn.reqDataType.Contains("ft,"))
//						{
//							//Debug.Log(conn.connectionId + "-sendft: " + conn.reqDataType + " - " + sFtMsgHead);
//
//							error = 0;
//							if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btFaceTriangles, btFaceTriangles.Length, out error))
//							{
//								string sMessage = "Error sending face tris via conn " + conn.connectionId + ": " + (NetworkError)error;
//								Debug.LogError(sMessage);
//
//								if(serverStatusText)
//								{
//									serverStatusText.text = sMessage;
//								}
//							}
//						}
                    }
                }
            }
        }
        catch (System.Exception ex)
        {
            LogErrorToConsole(ex.Message + "\n" + ex.StackTrace);

            if (serverStatusText)
            {
                serverStatusText.text = ex.Message;
            }
        }
    }