//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 //} } }
//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()); } }
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 //} }
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 } }
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()); } }
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]); } }
public SerializeCell(SerializeBase ser) { this._ser = ser; }
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); }