示例#1
0
    //client + server



    /*
     * // Use this for initialization
     * void Start () {
     *  bFormatter = new BinaryFormatter();
     *
     *  //PlayerUpdates testUpdatesIn = new PlayerUpdates(new PlayerInfo[1] { new PlayerInfo(1, 1.1f,2.2f) });
     * // PlayerUpdates testUpdatesOut = (PlayerUpdates)DeserializeClass(SerializeClass(testUpdatesIn));
     *  SerializeBase input;    //send input with udp message
     *  SerializeBase output;   //get output from received udp message
     *
     *  input = new PlayerUpdates(new PlayerInfo[1] { new PlayerInfo(1, 1.1f, 2.2f) });
     *  output = DeserializeClass(SerializeClass(input));
     *
     *  //server + client
     *  HandleSerializedData(output);
     *
     *
     *  // Debug.Log(testUpdatesOut.PlayerInfos[0].playerID);
     *  // PlayerInput testInput = new PlayerInput(0, 1.1f, true, false);
     *  // PlayerInput testOutput = (PlayerInput)DeserializeClass(SerializeClass(testInput));
     * }*/

    //server + client but different
    protected virtual void HandleSerializedData(SerializeBase data)
    {
        //BOTH
        Debug.Log("dont do this pls");
        Type t = data.GetType();


        //SERVER
        //pseudo code:
        //if(t.Equals(typeof(ConnectionInfo)))
        //{
        //ConnectionInfo connectionInfo = (ConnectionInfo)data;
        //if(connectionInfo.requestMatch)
        //{
        //save client data and wait for another client with the same request
        //return;
        //}
        //}


        //CLIENT
        //if(t.Equals(typeof(MatchInfo)))
        //{
        //MatchInfo matchInfo = (MatchInfo)data;
        //if(matchInfo.gameEnd)
        //{
        //get matchInfo.scores
        //goto lobby menu, ready for next match
        //return;
        //}
        //if(matchInfo.playerdied)//do something? TODO design syncing
        //}

        //SERVER
        if (t.Equals(typeof(PlayerInput)))
        {
            //update corresponding player object based on input

            //pseudo code:
            //PlayerInput input = (PlayerInput)data;
            //find player object and execute movement method... players[input.playerid].doMovement(input.xAxis, input.Jump, input.Action);
            //create new PlayerUpdates(input.playerid, new playerInfo(players[input.playerid].tranform.position.x, players[input.playerid].tranform.position.y);
            //serialize PlayerUpdates....
            //send serialized Playerupdates to all (or all other?) clients
        }

        //CLIENT
        if (t.Equals(typeof(PlayerUpdates)))
        {
            //pseudo code:
            //PlayerUpdates updates = (PlayerUpdates)data;
            //for (int i = 0; i < updates.PlayerInfos.Length; i++)
            //{
            //PlayerInfo info = updates.PlayerInfos[i];
            //find player object and execute set position method... players[info.playerID].SetPosition(info.xPos, info.yPos);
            //no need to update server after this
            //}
        }
    }
示例#2
0
 //server + client
 public byte[] SerializeClass(SerializeBase input)
 {
     input.gameTime = GameTimer;
     using (var memStream = new MemoryStream())        {
         xmlSerializer.Serialize(memStream, input);
         //Debug.Log(memStream.ToArray().ToString());
         //Debug.Log(memStream.ToArray().Length);    //check bytesize
         return(memStream.ToArray());
     }
 }
示例#3
0
    protected override void HandleSerializedData(SerializeBase data)
    {
        //return;
        //Debug.Log("handling data...");
        //Debug.Log("gametimer: " + data.gameTime);
        testFloat = 99;
        if (GameTimer - data.gameTime > (float)Ping / 2000f + 0.01f || GameTimer - data.gameTime < (float)Ping / 2000f - 0.01f)
        {
            GameTimer = data.gameTime + ((float)Ping / 2000f);
        }
        Type t = data.GetType();

        testFloat = 91;
        if (t.Equals(typeof(PlayerUpdates)))
        {
            newUpdates = (PlayerUpdates)data;
            //pseudo code:

            /*
             *    PlayerUpdates updates = (PlayerUpdates)data;
             *    for (int i = 0; i < updates.PlayerInfos.Length; i++)
             *    {
             *    PlayerInfo info = updates.PlayerInfos[i];
             *    GameObject player = Array.Find(players, x => (int)x.playerID == info.playerID).gameObject;
             *    player.transform.position = new Vector3(info.xPos, info.yPos, player.transform.position.z);
             *
             *
             *    //find player object and execute set position method... players[info.playerID].SetPosition(info.xPos, info.yPos);
             *    //no need to update server after this
             *    }
             */
        }
        //CLIENT
        //if(t.Equals(typeof(MatchInfo)))
        //{
        //MatchInfo matchInfo = (MatchInfo)data;
        //if(matchInfo.gameEnd)
        //{
        //get matchInfo.scores
        //goto lobby menu, ready for next match
        //return;
        //}
        //if(matchInfo.playerdied)//do something? TODO design syncing
        //}
    }
示例#4
0
    protected override void HandleSerializedData(SerializeBase data)
    {
        testFloat = 1111;
        Type t = data.GetType();

        if (t.Equals(typeof(PlayerInput)))
        {
            PlayerInput input = (PlayerInput)data;
            lock (inputs)
            {
                inputs[input.playerID] = input;
            }
            testFloat = 2222;
            //find player object and execute movement method... players[input.playerid].doMovement(input.xAxis, input.Jump, input.Action);
            //create new PlayerUpdates(input.playerid, new playerInfo(players[input.playerid].tranform.position.x, players[input.playerid].tranform.position.y);
            //serialize PlayerUpdates....
            //send serialized Playerupdates to all (or all other?) clients
        }
    }
示例#5
0
        public override void Fill <T>(T t)
        {
            if (t is UnityEngine.GameObject)
            {
                var obj = t as UnityEngine.GameObject;
                this.transform = SerializeBase.Create <Serializable.Transform, UnityEngine.Transform>(obj.transform);
                prefab         = obj.name;

                //从父节点名字获取所属层
                int.TryParse(obj.transform.parent.gameObject.name.Substring(5), out layerIndex);

                decorateIndex = MapEditorMgr.ins.GetDecorateIndex(obj);

                if (EnableLog)
                {
                    Debug.Log("fill map ojbect name=" + obj.name);
                }

                CustomerPropertyBase com = obj.GetComponent <CustomerPropertyBase>();
                //自定义属性
                if (com != null)
                {
                    Type type = com.GetType();

                    FieldInfo field = type.GetField("serialization");
                    if (field != null)
                    {
                        //extPropJson = JsonMapper.ToJson(field.GetValue(com));
                        //extPropClassName = field.GetValue(com).GetType().Name;
                        //extPropClassIndex = MapEditor.MapEditorUtils.GetClassIndex(extPropClassName);
                    }
                }

                return;
            }
            else
            {
                Debug.LogWarning("type error cast " + t.GetType().ToString() + "  to " + this.GetType().ToString());
            }
        }
示例#6
0
        public ProtocolProfile(XmlNode node)
        {
            XmlAttribute attrSer = node.Attributes["serialize"];

            if (attrSer == null)
            {
                throw new XmlException("Not find attrbuts:" + node.Name + "[@'serialize']");
            }
            string value = attrSer.Value.Trim().ToLower();

            if (value.Equals("json"))
            {
                this.SerializerType = SerializeType.JSON;
            }
            else if (value.Equals("binary"))
            {
                this.SerializerType = SerializeType.Binary;
            }
            else if (value.Equals("gaea"))
            {
                this.SerializerType = SerializeType.GAEA;
            }
            else
            {
                throw new NotSupportedException("Protocol not supported!");
            }
            XmlAttribute attrSerializer = node.Attributes["serializeType"];

            if (attrSerializer != null)
            {
                string serializeType = attrSerializer.Value;
                if (!string.IsNullOrEmpty(serializeType))
                {
                    string[] types = serializeType.Split(',');
                    if (types.Length == 2)
                    {
                        this.Serializer = System.Reflection.Assembly.Load(types[0]).CreateInstance(types[1]) as SerializeBase;
                    }
                    else if (types.Length == 1)
                    {
                        this.Serializer = Activator.CreateInstance(Type.GetType(types[0])) as SerializeBase;
                    }
                }
            }
            if (Serializer == null)
            {
                this.Serializer = SerializeBase.GetInstance();
            }
            XmlAttribute attrEncoder = node.Attributes["encoder"];

            if (attrEncoder == null)
            {
                this.Encoder = Encoding.UTF8;
            }
            else
            {
                this.Encoder = Encoding.GetEncoding(attrEncoder.Value);
            }
            this.Serializer.Encoder = this.Encoder;
            ServiceID = byte.Parse(node.ParentNode.ParentNode.Attributes["id"].Value);
            Compress  = (CompressType)Enum.Parse(typeof(CompressType), node.Attributes["compressType"].Value, true);
        }
        /// <summary>
        /// 添加需要被序列化的对象类型
        /// </summary>
        /// <param name="type"></param>
        void AddClass(Type type)
        {
            if (serializeMap.ContainsKey(type))
            {
                return;
            }

            if (!typeof(ISerObj).IsAssignableFrom(type))
            {
                throw new Exception("AddClass type must be a subclass of interface 'ISerObj'");
            }

            List <Type> newAddTyps = new List <Type>();

            FieldInfo[] allField = type.GetFields(BindingFlags.Public | BindingFlags.Instance);

            SerializeBase[]   sbArray = new SerializeBase[allField.Length];
            DeserializeBase[] dbArray = new DeserializeBase[allField.Length];
            for (int i = 0; i < allField.Length; i++)
            {
                Type fieldType = allField[i].FieldType;
                if (fieldType == typeof(int))
                {
                    sbArray[i] = new SerializeInt(allField[i]);
                    dbArray[i] = new DeserializeInt(allField[i]);
                }
                else if (fieldType == typeof(string))
                {
                    sbArray[i] = new SerializeString(allField[i]);
                    dbArray[i] = new DeserializeString(allField[i]);
                }
                else if (fieldType == typeof(byte))
                {
                    sbArray[i] = new SerializeByte(allField[i]);
                    dbArray[i] = new DeserializeByte(allField[i]);
                }
                else if (fieldType == typeof(float))
                {
                    sbArray[i] = new SerializeFloat(allField[i]);
                    dbArray[i] = new DeserializeFloat(allField[i]);
                }
                else if (typeof(ISerObj).IsAssignableFrom(fieldType))
                {
                    sbArray[i] = new SerializeObj(allField[i]);
                    dbArray[i] = new DeserializeObj(allField[i]);
                    if (!newAddTyps.Contains(fieldType))
                    {
                        newAddTyps.Add(fieldType);
                    }
                    //这里没有调用AddClass,而是添加到一个列表中,在serializeMap中成功添加后,才处理递归AddClass
                    //防止在发生类型嵌套(A包含B,B包含A)时出现AddClass递归死循环,
                    //AddClass(fieldType);
                }
                else if (fieldType.IsArray)
                {
                    sbArray[i] = new SerializeArray(allField[i]);
                    dbArray[i] = new DeserializeArray(allField[i]);
                    Type eleType = fieldType.GetElementType();
                    if (typeof(ISerObj).IsAssignableFrom(eleType))
                    {
                        if (!newAddTyps.Contains(eleType))
                        {
                            newAddTyps.Add(eleType);
                        }
                    }
                }
                else
                {
                    throw new Exception("Can't serialize type -->" + allField[i].FieldType.ToString());
                }
            }
            ISerializable   ser;
            IDeserializable des;

            if (sbArray.Length == 1)
            {
                ser = new SerializeCell(sbArray[0]);
                des = new DeserializeCell(dbArray[0]);
            }
            else
            {
                ser = new SerializeUnit(sbArray);
                des = new DeserializeUnit(dbArray);
            }
            serializeMap.Add(type, ser);
            deserializeMap.Add(type, des);

            for (int i = 0; i < newAddTyps.Count; i++)
            {
                AddClass(newAddTyps[i]);
            }
        }
示例#8
0
 public SerializeCell(SerializeBase ser)
 {
     this._ser = ser;
 }
示例#9
0
    public override void receiveCallback(IAsyncResult res)
    {
        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 8000);

        byte[] received = serverClient.EndReceive(res, ref RemoteIpEndPoint);
        serverClient.BeginReceive(new AsyncCallback(receiveCallback), null);

        string stringData = Encoding.ASCII.GetString(received);

        testFloat = 1;
        if (!stringData.StartsWith("<")) //testing only
        {
            Debug.Log(stringData);
        }
        if (!isReady && stringData.Contains(":"))    //it contains a ip:port
        {
            testFloat = 2;
            string[] splitData = stringData.Split(':');
            connectedClient = new NetworkBase.UDPClient(IPAddress.Parse(splitData[0]), int.Parse(splitData[1]));

            NetworkBase.playerIDs = new int[controllingPlayers];
            int otherPlayers = int.Parse(splitData[2]);
            for (int i = 0; i < controllingPlayers; i++)
            {
                NetworkBase.playerIDs[i] = otherPlayers + i;
            }
            byte[] data = Encoding.ASCII.GetBytes("test123");
            SendToClient(connectedClient, data);
            StartTestConnection();
            testFloat = 3;
        }
        testFloat = 8;

        if (stringData == "TestConnection")
        {
            connectionSucces = true;
        }

        if (stringData == "StartGame")
        {
            testFloat             = 9;
            isReady               = true;
            NetManager.hasStarted = true;
        }
        //Debug.Log("received client: " + (stringData.StartsWith("<")? "data" : stringData));

        //ping, in progress
        if (stringData == "PingResult")
        {
            testFloat = 10;
            receivedPackets--;

            receivedPing = true;

            isPinging   = false;
            startedPing = false;
        }
        else
        {
            testFloat = 11;
            if (stringData.StartsWith("<"))
            {
                testFloat = 61;
                testFloat = received.Length;
                SerializeBase SB = DeserializeClass(received);
                testFloat = 63;
                HandleSerializedData(SB);
                testFloat = 62;
            }
        }
        //receiveCallback(res);
        testFloat = 4;
        //Debug.Log("started receiving..");
        receivedPackets++;
        //serverClient.BeginReceive(new AsyncCallback(receiveCallback), null);
    }