示例#1
0
 public void CheckMessageDie(MessageToClient m)
 {
     Assert.AreEqual(m.cmd, "update");
     Assert.AreEqual(m.id, 101112);
     Assert.AreEqual(((MessageDie)m.data.data).killer, "jill");
     Assert.AreEqual(((MessageDie)m.data.data).crash, true);
 }
示例#2
0
 private void SocketMessage(object sender, MessageEventArgs e)
 {
     //invoke when socket message
     if (e != null && e.Type == Opcode.Text)
     {
         try {
             MessageToClient m = m_deserializer.Deserialize <MessageToClient>(e.Data);
             // TODO: make this a dict to callback
             if (m.cmd.Equals("start"))
             {
                 StartPlayer(m.id, "");
             }
             else if (m.cmd.Equals("remove"))
             {
                 RemovePlayer(m.id);
             }
             else if (m.cmd.Equals("update"))
             {
                 UpdatePlayer(m.id, m.data);
             }
             else
             {
                 Debug.LogError("unknown client message: " + m.cmd);
             }
         } catch (Exception ex) {
             Debug.LogException(ex); // TODO: Add object if possible
             return;
         }
     }
 }
 /// <summary>
 ///We will get a commannd for the client and by the command know what to do
 ///The format is commandid#string for example let suppose 1 is for sending config it will be 1x where x is the json string of the object.
 /// </summary>
 /// <param name="client"> The client</param>
 /// <param name="locker">The object we want to lock </param>
 public void HandleClient(TcpClient client, object locker)
 {
     
     //creating a task that will handle the client's commands.
     Task t = new Task(() =>
     {
         NetworkStream stream = client.GetStream();
         BinaryReader reader = new BinaryReader(stream);
         BinaryWriter writer = new BinaryWriter(stream);
         while (true)
         {
             //Getting the command.
             //readMutex.WaitOne();
             string commandLine = reader.ReadString();
            // readMutex.ReleaseMutex();
             Console.WriteLine("Got input: {0}", commandLine);
             //Getting id of command
             int id = int.Parse(commandLine[0] + "");
             string result = ExecuteCommand(commandLine, client);
             Console.WriteLine("Write the result");
             Console.WriteLine("Im here for  " + commandLine);
             //Sending to the client the result - false because we handle specific client
             MessageToClient message = new MessageToClient(id, result,false);
             //Locking this critical place
             lock (locker)
             {
                 writer.Write(message.ToJSON());
             }
         }
         //client.Close();
     });
     t.Start();
 }
示例#4
0
        public void OnReceive(IMessage message)
        {
            if (!(message is MessageToClient))
            {
                throw new Exception("Recieve Error !");
            }
            MessageToClient msg = message as MessageToClient;

            //自己的id小于0时为未初始化状态,此时初始化自己的id,然后发送message选择天赋
            if (this.id < 0)
            {
                isStartedGame = true;
                foreach (var gameObject in msg.GameObjectList)
                {
                    this.id   = gameObject.Key;
                    this.team = gameObject.Value.Team;
                    Console.WriteLine("\nThis Player :\n" + "\t" + id.ToString() + "\n\tposition: " + Position.ToString());
                    ClientCommunication.SendMessage(new MessageToServer
                    {
                        Talent      = playerTalent,
                        IsSetTalent = true
                    });
                    break;
                }
                messageToServer.ID = this.id;
            }

            this.Position         = new XYPosition(msg.GameObjectList[this.id].PositionX, msg.GameObjectList[this.id].PositionY);
            this._facingDirection = (THUnity2D.Direction)msg.GameObjectList[this.id].Direction;

            ChangeAllLabels(msg);
        }
        /// <summary>
        /// a function that handles the receiving of the incomming messages from the server.
        /// </summary>
        /// <returns></returns>
        public MessageToClient recieveMessage()
        {
            Task <MessageToClient> t = new Task <MessageToClient>(() =>
            {
                stream = client.GetStream();
                reader = new BinaryReader(stream);
                string result;
                try
                {
                    result = reader.ReadString();
                }
                catch (Exception)
                {
                    connected = false;
                    return(null);
                }
                MessageToClient message = new MessageToClient();
                message.FromJson(result);
                // Get result from server
                return(message);
            });

            t.Start();

            if (t.Result == null)
            {
                throw new Exception("Problem connecting");
            }
            return(t.Result);
        }
示例#6
0
        public void OnReciveNormal(MessageToClient msg, long clock) //处理游戏消息
        {
            switch (msg.MessageType)
            {
            case MessageType.StartGame:
                Hashable = new Dictionary <Int64, Tuple <int, int> >();
                for (int i = 0; i < msg.PlayerGUIDs.Count; i++)
                {
                    for (int j = 0; j < msg.PlayerGUIDs[0].TeammateGUIDs.Count; j++)
                    {
                        Hashable.Add(msg.PlayerGUIDs[i].TeammateGUIDs[j], new Tuple <int, int>(i, j));
                    }
                }
                gameform.movespeed = msg.SelfInfo.MoveSpeed;
                break;

            case MessageType.Gaming:
                if (System.Environment.TickCount64 - clock > 50)
                {
                    break;
                }
                Refresh(msg);
                break;

            case MessageType.EndGame:
                Application.Exit();
                break;

            default: break;
            }
        }
示例#7
0
 public void CheckMessageSetColor(MessageToClient m)
 {
     Assert.AreEqual(m.cmd, "update");
     Assert.AreEqual(m.id, 123);
     Assert.AreEqual(((MessageSetColor)m.data.data).color, "red");
     Assert.AreEqual(((MessageSetColor)m.data.data).style, "bold");
 }
示例#8
0
 private void Refresh(MessageToClient msg)  //刷新界面
 {
     gameform.selfguid  = msg.SelfInfo.Guid;
     gameform.movespeed = msg.SelfInfo.MoveSpeed;
     for (int i = 0; i < 50; i++) //读取颜色
     {
         for (int j = 0; j < 50; j++)
         {
             if (gameform.ColorState[i, j] == (int)msg.CellColors[j].RowColors[i])
             {
                 gameform.ColorChange[i, j] = false;
             }
             else
             {
                 gameform.ColorState[i, j]  = (int)msg.CellColors[j].RowColors[i];
                 gameform.ColorChange[i, j] = true;
             }
         }
     }
     foreach (var objinfo in msg.GameObjs)
     {
         Objdeal(objinfo);
     }
     gameform.Rebuild();
 }
示例#9
0
 public void WriteOne(MessageToClient msg)
 {
     cos.WriteMessage(msg);
     if (ms.Length > memoryCapacity)
     {
         Flush();
     }
 }
示例#10
0
 public void ChangeTaskLabel(MessageToClient msg)
 {
     Program.form.ControlLabels["Task"].Text = "Task : ";
     foreach (var task in msg.Tasks)
     {
         Program.form.ControlLabels["Task"].Text += "\n" + (DishType)task;
     }
 }
示例#11
0
        private void UpdatePlayer(MessageToClient msg)
        {
            NetPlayer player;

            if (!m_players.TryGetValue(msg.id, out player))
            {
                return;
            }
            player.SendUnparsedEvent(msg.data);
        }
示例#12
0
        public void SendMessage(MessageToClient msg)
        {
            Message message = new Message();

            message.Content    = msg;
            message.PacketType = PacketType.MessageToClient;
            byte[] bytes;
            message.WriteTo(out bytes);
            Send(bytes);
        }
示例#13
0
        public Server(ushort serverPort, ushort playerCount, ushort agentCount, uint MaxGameTimeSeconds, string token)
        {
            Communication.Proto.Constants.PlayerCount = playerCount;
            Communication.Proto.Constants.AgentCount  = agentCount;
            MaxRunTimeInSecond  = MaxGameTimeSeconds;
            ServerCommunication = new CommunicationImpl
            {
                ServerPort = serverPort,
                Token      = token
            };
            ServerCommunication.Initialize();
            ServerCommunication.MsgProcess += OnRecieve;
            ServerCommunication.GameStart();

            //初始化playerList
            //向所有Client发送他们自己的ID
            XYPosition[] bornPoints = { new XYPosition(2.5, 1.5), new XYPosition(48.5, 2.5), new XYPosition(48.5, 48.5), new XYPosition(2.5, 48.5) };
            for (int a = 0; a < Constants.AgentCount; a++)
            {
                Program.MessageToClient.Scores.Add(a, 0);
                Program.ScoreLocks.TryAdd(a, new object());
                for (int c = 0; c < Constants.PlayerCount; c++)
                {
                    Tuple <int, int> playerIDTuple = new Tuple <int, int>(a, c);
                    Program.PlayerList.TryAdd(playerIDTuple, new Player(bornPoints[a].x, bornPoints[a].y));//new Random().Next(2, WORLD_MAP_WIDTH - 2), new Random().Next(2, WORLD_MAP_HEIGHT - 2)));
                    Program.PlayerList[playerIDTuple].CommunicationID = playerIDTuple;
                    MessageToClient msg = new MessageToClient();
                    msg.GameObjectList.Add(
                        Program.PlayerList[playerIDTuple].ID,
                        new Communication.Proto.GameObject
                    {
                        ObjType   = ObjType.People,
                        IsMoving  = false,
                        Team      = playerIDTuple.Item1,
                        PositionX = Program.PlayerList[playerIDTuple].Position.x,
                        PositionY = Program.PlayerList[playerIDTuple].Position.y,
                        Direction = (Communication.Proto.Direction)Program.PlayerList[playerIDTuple].FacingDirection
                    });
                    ServerCommunication.SendMessage(new ServerMessage
                    {
                        Agent   = a,
                        Client  = c,
                        Message = msg
                    }
                                                    );
                }
            }

            SendMessageToAllClient();

            ServerRunThread = new Thread(Run);
            ServerRunThread.Start();
            Server.ServerDebug("Server constructed");
        }
示例#14
0
                public int CompareTo(object o)
                {
                    MessageToClient m = o as MessageToClient;

                    if (m != null)
                    {
                        return(id.CompareTo(m.id));
                    }
                    else
                    {
                        throw new NullReferenceException("Невозможно сравнить два объекта");
                    }
                }
示例#15
0
        private void LogMessage(MessageToClient msg)
        {
            MessageLogMessage data = m_deserializer.Deserialize <MessageLogMessage>(msg.data);

            if (data.type == "error")
            {
                m_log.Error(data.msg);
            }
            else
            {
                m_log.Tell(data.msg);
            }
        }
示例#16
0
 public void sendMessage(MessageToClient msgToClt)
 {
     try
     {
         byte[] sendByte = Encoding.Default.GetBytes(msgToClt.ToString());
         socket.Send(sendByte, sendByte.Length, 0);
     }
     catch (Exception ex)
     {
         Console.WriteLine("发送失败。");
         Console.WriteLine(ex);
         throw;
     }
 }
示例#17
0
        /// <summary>
        /// sending messages to all the clients.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="content"></param>
        /// <param name="client"></param>
        /// <param name="allClients"></param>
        public void SendMessage(int type, string content, TcpClient client, bool allClients)
        {
            NetworkStream stream = client.GetStream();
            BinaryReader  reader = new BinaryReader(stream);
            BinaryWriter  writer = new BinaryWriter(stream);
            //Convert to type of message
            MessageToClient message = new MessageToClient(type, content, allClients);

            //Locking this critical place
            lock (locker)
            {
                writer.Write(message.ToJSON());
            }
        }
示例#18
0
        private void StartGame(MessageToClient msg)
        {
            HFTMessageGameStart data = m_deserializer.Deserialize <HFTMessageGameStart>(msg.data);

            m_id = data.id;
            QueueEvent(() =>
            {
                var handler = OnConnect;
                if (handler != null)
                {
                    handler();
                }
            });
        }
示例#19
0
    public void OnReceive(IMessage message)
    {
        UnityEngine.Debug.Log("received:" + message.ToString());
        if (!(message is MessageToClient))
        {
            throw new Exception("Recieve Error !");
        }
        MessageToClient msg = message as MessageToClient;

        //this.id.Item1 = msg.PlayerIDAgent;
        //this.id.Item2 = msg.PlayerIDClient;
        x = (float)BitConverter.Int64BitsToDouble(msg.PlayerPositionX);
        y = (float)BitConverter.Int64BitsToDouble(msg.PlayerPositionY);

        UnityEngine.Debug.Log("Player " + msg.PlayerIDAgent.ToString() + " , " + msg.PlayerIDClient.ToString() + "  position: " + $"{x},{y}");
    }
示例#20
0
        public void ChangeAllLabels(MessageToClient msg)
        {
            if (lastRecieveMessage.GetHashCode() == msg.GetHashCode())
            {
                //Console.WriteLine("Same messageToClient");
                return;
            }
            IDsToDelete = new HashSet <long>(Program.form.playerLabels.Keys);
            foreach (var gameObject in msg.GameObjectList)
            {
                moveFormLabel(gameObject.Key, gameObject.Value, ref IDsToDelete);
            }
            foreach (var number in IDsToDelete)
            {
                Console.WriteLine("Delete Form : " + number);
                if (Program.form.InvokeRequired)
                {
                    Program.form.Invoke(new Action(() =>
                    {
                        Program.form.Controls.Remove(Program.form.playerLabels[number]);
                    }));
                }
                else
                {
                    Program.form.Controls.Remove(Program.form.playerLabels[number]);
                }
                Program.form.playerLabels.Remove(number);
            }

            if (lastRecieveMessage.Tasks.GetHashCode() != msg.Tasks.GetHashCode())
            {
                if (Program.form.ControlLabels["Task"].InvokeRequired)
                {
                    Program.form.ControlLabels["Task"].Invoke(new Action <MessageToClient>(ChangeTaskLabel), msg);
                }
                else
                {
                    ChangeTaskLabel(msg);
                }
            }
            if (msg.Scores.ContainsKey(team))
            {
                ChangeControlLabelText("Score", msg.Scores[team].ToString());
            }
        }
示例#21
0
 private void UpdateGame(MessageToClient msg)
 {
     try
     {
         HFTMessageCmd   cmd = m_deserializer.Deserialize <HFTMessageCmd>(msg.data);
         CmdEventHandler handler;
         if (!m_handlers.TryGetValue(cmd.cmd, out handler))
         {
             m_log.Error("unhandled GameServer cmd: " + cmd.cmd);
             return;
         }
         handler(m_deserializer, this, cmd.data, msg.id);
     }
     catch (Exception ex)
     {
         m_log.Error(ex);
     }
 }
示例#22
0
        public void MoreAdvancedTest()
        {
            Deserializer deserializer = new Deserializer();

            MessageCmdDataCreator mcdc = new MessageCmdDataCreator();

            mcdc.RegisterCreator <MessageSetColor>();
            mcdc.RegisterCreator <MessageSetName>();
            mcdc.RegisterCreator <MessageLaunch>();
            mcdc.RegisterCreator <MessageDie>();

            deserializer.RegisterCreator(mcdc);

            string ja = "{\"cmd\":\"update\",\"id\":123,\"data\":{\"cmd\":\"setColor\",\"data\":{\"color\":\"red\",\"style\":\"bold\"}}}";
            string jb = "{\"cmd\":\"update\",\"id\":345,\"data\":{\"cmd\":\"setName\",\"data\":{\"name\":\"gregg\"}}}";
            string jc = "{\"cmd\":\"update\",\"id\":789,\"data\":{\"cmd\":\"launch\",\"data\":{}}}";
            string jd = "{\"cmd\":\"update\",\"id\":101112,\"data\":{\"cmd\":\"die\",\"data\":{\"killer\":\"jill\",\"crash\":true}}}";

            MessageToClient ma = deserializer.Deserialize <MessageToClient>(ja);
            MessageToClient mb = deserializer.Deserialize <MessageToClient>(jb);
            MessageToClient mc = deserializer.Deserialize <MessageToClient>(jc);
            MessageToClient md = deserializer.Deserialize <MessageToClient>(jd);

            CheckMessageSetColor(ma);
            CheckMessageSetName(mb);
            CheckMessageLaunch(mc);
            CheckMessageDie(md);

            string sa = Serialize.From(ma);
            string sb = Serialize.From(mb);
            string sc = Serialize.From(mc);
            string sd = Serialize.From(md);

            MessageToClient ma2 = deserializer.Deserialize <MessageToClient>(sa);
            MessageToClient mb2 = deserializer.Deserialize <MessageToClient>(sb);
            MessageToClient mc2 = deserializer.Deserialize <MessageToClient>(sc);
            MessageToClient md2 = deserializer.Deserialize <MessageToClient>(sd);

            CheckMessageSetColor(ma2);
            CheckMessageSetName(mb2);
            CheckMessageLaunch(mc2);
            CheckMessageDie(md2);
        }
        private async Task OnMessageAsync(MessageToClient message)
        {
            try
            {
                var networkCommand = JsonUtility.FromJson <NetworkCommand>(message.data);
                if (networkCommand.commandInternalIsResponse)
                {
                    _connection.ResolveTransaction(networkCommand, message.data);
                }
                else
                {
                    try
                    {
                        var responseToMaster = await _commands.ProcessIncomingMessage(_connection, networkCommand, message.data, _client);

                        responseToMaster.commandInternalType       = NetworkCommand.CommandTypeFor(responseToMaster.GetType());
                        responseToMaster.commandInternalIsResponse = true;
                        responseToMaster.commandInternalId         = networkCommand.commandInternalId;
                        await _connection.Send(responseToMaster);
                    }
                    catch (Exception error)
                    {
                        _manager.Logger.OnError(error);
                        await _connection.Send(new NetworkCommandError()
                        {
                            message                   = error.Message,
                            commandInternalType       = NetworkCommand.CommandTypeFor(typeof(NetworkCommandError)),
                            commandInternalIsResponse = true,
                            commandInternalId         = networkCommand.commandInternalId
                        });
                    }
                }
            }
            catch (Exception error)
            {
                _manager.Logger.OnError(error);
            }
        }
示例#24
0
        public MessageToClient?ReadOne()
        {
beginRead:
            if (Finished)
            {
                return(null);
            }
            var pos = cos.Position;

            try
            {
                MessageToClient?msg = new MessageToClient();
                cos.ReadMessage(msg);
                return(msg);
            }
            catch (InvalidProtocolBufferException)
            {
                var leftByte = buffer.Length - pos;                     // 上次读取剩余的字节
                for (int i = 0; i < leftByte; ++i)
                {
                    buffer[i] = buffer[pos + i];
                }
                var bufferSize = gzs.Read(buffer, (int)leftByte, (int)(buffer.Length - leftByte)) + leftByte;
                if (bufferSize == leftByte)
                {
                    Finished = true;
                    return(null);
                }
                if (bufferSize != buffer.Length)                        // 不留空位,防止 CodedInputStream 获取信息错误
                {
                    var tmpBuffer = new byte[bufferSize];
                    Array.Copy(buffer, tmpBuffer, bufferSize);
                    buffer = tmpBuffer;
                }
                cos = new CodedInputStream(buffer);
                goto beginRead;
            }
        }
示例#25
0
        private void StartPlayer(MessageToClient msg)
        {
            if (m_players.ContainsKey(msg.id))
            {
                return;
            }

            string name = "";

            RealNetPlayer.Options options = new RealNetPlayer.Options();
            if (msg.data != null)
            {
                DeJson.Deserializer deserializer = new DeJson.Deserializer();
                HFTPlayerStartData  startData    = deserializer.Deserialize <HFTPlayerStartData>(msg.data);
                if (startData != null)
                {
                    options.sessionId = startData.__hft_session_id__;
                    name = startData.__hft_name__;
                }
            }

            if (System.String.IsNullOrEmpty(name))
            {
                name = "Player" + (++m_totalPlayerCount);
            }

            NetPlayer player = new RealNetPlayer(this, msg.id, name, options);

            m_players[msg.id] = player;
            QueueEvent(() =>
            {
                var handler = OnPlayerConnect;
                if (handler != null)
                {
                    handler(new PlayerConnectMessageArgs(player, name, msg.data));
                }
            });
        }
示例#26
0
 private void GameStart(MessageToClient message)
 {
     //根据agent发来的消息初始化各个角色
     foreach (var obj in message.GameObjs)
     {
         if (obj.GameObjType == GameObjType.Character)
         {
             if (heros.ContainsKey(obj.Guid))
             {
                 heros[obj.Guid].Renew(obj); //存在就更新数据
             }
             else
             {
                 if (!isCharactersExisted.ContainsKey(obj.Guid))
                 {
                     isCharactersExisted.TryAdd(obj.Guid, true);
                     TaskQueue.Enqueue(new KeyValuePair <long, GameObjInfo>(obj.Guid, obj)); //不存在就标记并创建,下面同理
                 }
             }
         }
     }
     isGameStarted = true;
 }
示例#27
0
    void ReadPlayback()
    {
        // 新建一个timer,每隔固定时间读一段消息
        IMessage <MessageToClient> message;

        playbackTimer = new System.Threading.Timer(
            (o) =>
        {
            lock (playbackLock)
            {
                message = new MessageToClient();
                if (playbackReader.Read(ref message))
                {
                    OnReceive(message);
                }
                else
                {
                    Debug.Log("回放结束");
                    playbackTimer.Dispose();
                }
            }
        }, null, 0, 50);
    }
示例#28
0
        public void MoreAdvancedTest()
        {
            MessageCmdDataCreator.Instance.RegisterCreator <MessageSetColor>();
            MessageCmdDataCreator.Instance.RegisterCreator <MessageSetName>();
            MessageCmdDataCreator.Instance.RegisterCreator <MessageLaunch>();
            MessageCmdDataCreator.Instance.RegisterCreator <MessageDie>();

            string ja = "{\"cmd\":\"update\",\"id\":123,\"data\":{\"cmd\":\"setColor\",\"data\":{\"color\":\"red\",\"style\":\"bold\"}}}";
            string jb = "{\"cmd\":\"update\",\"id\":345,\"data\":{\"cmd\":\"setName\",\"data\":{\"name\":\"gregg\"}}}";
            string jc = "{\"cmd\":\"update\",\"id\":789,\"data\":{\"cmd\":\"launch\",\"data\":{}}}";
            string jd = "{\"cmd\":\"update\",\"id\":101112,\"data\":{\"cmd\":\"die\",\"data\":{\"killer\":\"jill\",\"crash\":true}}}";

            MessageToClient ma = JsonUtil.ToObject <MessageToClient>(ja);
            MessageToClient mb = JsonUtil.ToObject <MessageToClient>(jb);
            MessageToClient mc = JsonUtil.ToObject <MessageToClient>(jc);
            MessageToClient md = JsonUtil.ToObject <MessageToClient>(jd);

            CheckMessageSetColor(ma);
            CheckMessageSetName(mb);
            CheckMessageLaunch(mc);
            CheckMessageDie(md);

            string sa = JsonUtil.ToJson(ma);
            string sb = JsonUtil.ToJson(mb);
            string sc = JsonUtil.ToJson(mc);
            string sd = JsonUtil.ToJson(md);

            MessageToClient ma2 = JsonUtil.ToObject <MessageToClient>(sa);
            MessageToClient mb2 = JsonUtil.ToObject <MessageToClient>(sb);
            MessageToClient mc2 = JsonUtil.ToObject <MessageToClient>(sc);
            MessageToClient md2 = JsonUtil.ToObject <MessageToClient>(sd);

            CheckMessageSetColor(ma2);
            CheckMessageSetName(mb2);
            CheckMessageLaunch(mc2);
            CheckMessageDie(md2);
        }
示例#29
0
        public void PlayBack()
        {
            Console.WriteLine("Press any key to start playback");
            Console.ReadKey();
            IMessage <MessageToClient> message;

            playBackTimer = new System.Threading.Timer(
                (o) =>
            {
                lock (PlayBackLock)
                {
                    message = new MessageToClient();
                    if (Reader.Read(ref message))
                    {
                        OnReceive(message);
                    }
                    else
                    {
                        Console.WriteLine("PlayBack End !");
                        playBackTimer.Dispose();
                    }
                }
            }, null, 0, 50);
        }
示例#30
0
 private void SocketMessage(object sender, MessageEventArgs e)
 {
     m_gotMessages = true;
     //invoke when socket message
     if (e != null && e.IsText)
     {
         try
         {
             // Handle ping.
             if (e.Data == "P")
             {
                 Send("P");
                 return;
             }
             if (m_options.showMessages)
             {
                 m_log.Tell("r[" + (m_recvCount++) + "] " + e.Data);
             }
             MessageToClient m       = m_deserializer.Deserialize <MessageToClient>(e.Data);
             MessageHandler  handler = null;
             if (m_msgHandlers.TryGetValue(m.cmd, out handler))
             {
                 handler(m);
             }
             else
             {
                 m_log.Error("unknown client message: " + m.cmd);
             }
         }
         catch (Exception ex)
         {
             m_log.Error(ex);  // TODO: Add object if possible
             return;
         }
     }
 }