public void HandleReceive(object o)
        {
            ClientStateObject state   = new ClientStateObject();
            Socket            handler = (Socket)o;

            state.workSocket = handler;

            while (true)
            {
                receiveDone.Reset();

                Console.WriteLine("               Client Side                   HandleReceive loop" + handler.RemoteEndPoint.ToString());
                try
                {
                    handler.BeginReceive(state.buffer, 0, ClientStateObject.BufferSize, 0,
                                         new AsyncCallback(ClientUnit.ReceiveCallback), state);
                }
                catch
                {
                }
                receiveDone.WaitOne();
            }
        }
Exemple #2
0
        public static void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                // Retrieve the state object and the client socket
                // from the asynchronous state object.
                Console.WriteLine("Получение данных...");
                ClientStateObject state  = (ClientStateObject)ar.AsyncState;
                Socket            client = state.workSocket;

                // Read data from the remote device.
                int bytesRead = client.EndReceive(ar);

                if (bytesRead > 0)
                {
                    state.sb.Clear();
                    // There might be more data, so store the data received so far.
                    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));

                    // Get the rest of the data.
                    //client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    //    new AsyncCallback(ReceiveCallback), state);
                    Console.WriteLine(state.sb.ToString());
                    if (state.sb.ToString().StartsWith("0"))
                    {
                        response = state.sb.ToString().Split(' ')[1];
                        ID       = Int32.Parse(state.sb.ToString().Split(' ')[1]);

                        // Write the response to the console.
                        Console.WriteLine("Response received. ID : {0}", ID);
                        if (Form1.isServer)
                        {
                            Form1.player = new Player(0, 0, Resource1.Player1);
                        }
                        else
                        {
                            Form1.player = new Player(0, 50, Resource1.Player2);
                        }
                        Form1.player.ID = ID;
                        Console.WriteLine("                                                  Player ID: " + Form1.player.ID);
                    }
                    if (state.sb.ToString().StartsWith("1"))
                    {
                        response = state.sb.ToString().Split(' ')[1];
                        ID       = Int32.Parse(state.sb.ToString().Split(' ')[1]);

                        // Write the response to the console.
                        Console.WriteLine("Response received. another ID : {0}", ID);
                        if (!Form1.isServer)
                        {
                            Form1.anotherPlayer = new Player(0, 0, Resource1.Player1);
                        }
                        else
                        {
                            Form1.anotherPlayer = new Player(0, 50, Resource1.Player2);
                            Form1.timerBlock    = false;
                        }
                        Form1.anotherPlayer.ID = ID;
                        Send(socket, PacketInfo.Message, ID + " " + Form1.player.x + " " + Form1.player.y + " " + Form1.player.ID);
                    }
                    else if (state.sb.ToString().StartsWith("<POSITION>"))
                    {
                        response = state.sb.ToString();
                        string[] strs = state.sb.ToString().Split(' ');

                        Form1.anotherPlayer.x = Int32.Parse(strs[1]);
                        Form1.anotherPlayer.y = Int32.Parse(strs[2]);

                        Console.WriteLine("Response received. X position {0}, Y position {1}", Form1.anotherPlayer.x, Form1.anotherPlayer.y);
                    }
                    else if (state.sb.ToString().StartsWith("<MESSAGE>"))
                    {
                        response = state.sb.ToString();
                        string[] strs = state.sb.ToString().Split(' ');

                        if (!Form1.isServer)
                        {
                            Form1.anotherPlayer = new Player(0, 0, Resource1.Player1);
                        }
                        else
                        {
                            Form1.anotherPlayer = new Player(0, 50, Resource1.Player2);
                        }
                        Form1.anotherPlayer.x  = Int32.Parse(strs[2]);
                        Form1.anotherPlayer.y  = Int32.Parse(strs[3]);
                        Form1.anotherPlayer.ID = Int32.Parse(strs[4]);
                    }
                    else if (state.sb.ToString().StartsWith("<ENEMY_CREATE>"))
                    {
                        response = state.sb.ToString();
                        string[] strs = state.sb.ToString().Split(' ');

                        Form1.instance.enemies.Add(Form1.instance.createNewEnemy(Int32.Parse(strs[6]), Int32.Parse(strs[1]), Int32.Parse(strs[2]), Int32.Parse(strs[3]), Int32.Parse(strs[4]), Int32.Parse(strs[5])));
                    }
                    else if (state.sb.ToString().StartsWith("<SHOOT>"))
                    {
                        response = state.sb.ToString();
                        string[] strs = state.sb.ToString().Split(' ');

                        if (Form1.player.ID.ToString() == strs[1])
                        {
                            Form1.instance.shoot(Int32.Parse(strs[2]), Form1.player.ID);
                        }
                        else
                        {
                            Form1.instance.shootAnotherPlayer(Int32.Parse(strs[2]), Form1.anotherPlayer.ID); //TODO переделать id пули
                        }
                    }
                    else if (state.sb.ToString().StartsWith("<ENEMY_KILLED>"))
                    {
                        response = state.sb.ToString();
                        string[]     strs    = state.sb.ToString().Split(' '); //TODO нужно правильно разбить входящее сообщение
                        List <Enemy> enemies = new List <Enemy>();
                        int          counter = 0;
                        for (int i = 1; i < (strs.Length / 2) + 1; i++)
                        {
                            Enemy en = Form1.instance.enemies.Find(e => e.enemyID == Int32.Parse(strs[i]));
                            if (en != null)
                            {
                                en.killedBy = Int32.Parse(strs[i + 1]);
                                counter     = i + 2;
                                enemies.Add(en);
                                i++;
                            }
                            else
                            {
                                counter = i + 2;
                                i++;
                            }
                        }

                        List <Shell> shells = new List <Shell>();

                        for (int i = counter; i < (strs.Length); i++)
                        {
                            shells.Add(Form1.instance.shells.Find(s => s.shellID == Int32.Parse(strs[i])));
                        }

                        foreach (Enemy enemy in enemies)
                        {
                            Form1.instance.enemies.Remove(enemy);
                            if (enemy != null)
                            {
                                if (enemy.killedBy == Form1.player.ID)
                                {
                                    Form1.player.score += enemy.killBonus;
                                    Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Kill by Server");
                                }
                                else
                                {
                                    Form1.anotherPlayer.score += enemy.killBonus;
                                    Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Kill by another player by Server");
                                }
                            }
                        }
                        foreach (Shell shell in shells)
                        {
                            if (Form1.instance.shells.Count > 0)
                            {
                                Form1.instance.shells.Remove(shell);
                            }
                        }
                    }

                    a.receiveDone.Set();
                    localReceiveDone.Set();
                }
                else
                {
                    // All the data has arrived; put it in response.
                    if (state.sb.Length > 1)
                    {
                        response = state.sb.ToString();
                    }
                    // Signal that all bytes have been received.
                    //receiveDone.Set();
                    a.receiveDone.Set();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }