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(); } }
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()); } }