private void SalaEspera_Load(object sender, EventArgs e) { Thread threadAtualizadoraUsuarios = new Thread(()=> { while (true) { List<String> apelidosRemover = new List<String>(); this.Invoke((MethodInvoker)(() => jogadores.Items.Clear())); foreach (var item in jogadoresMapa) { Jogador jog = item.Value; var diffInSeconds = (DateTime.Now - jog.momento).TotalSeconds; String texto = jog.apelido + " - " + jog.nome + (jog.confirmado ? " (CONFIRMADO)" : ""); if (diffInSeconds > 10) { apelidosRemover.Add(jog.apelido); } else if (!jogadores.Items.Contains(texto)) { this.Invoke((MethodInvoker)(() => jogadores.Items.Add(texto))); } } foreach(string appRev in apelidosRemover) { jogadoresMapa.Remove(appRev); } Thread.Sleep(1000); } }); threadAtualizadoraUsuarios.Start(); Thread threadLeitoraBroadcast = new Thread(() => { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 20152); sock.Bind(iep); EndPoint ep = (EndPoint)iep; while (true) { byte[] data = new byte[1024]; int recv = sock.ReceiveFrom(data, ref ep); string stringData = Encoding.ASCII.GetString(data, 0, recv); int tipoMsg = Int32.Parse(stringData.Substring(0, 2)); int tamanhoMsg = Int32.Parse(stringData.Substring(2, 3)); String mensagem = stringData.Substring(5, tamanhoMsg - 5); String[] dados = mensagem.Split('|'); switch (tipoMsg) { case 1: if (!jogadoresMapa.ContainsKey(dados[0])) { Jogador jog = new Jogador(); jog.apelido = dados[0]; jog.nome = dados[1]; jogadoresMapa.Add(jog.apelido, jog); } else { Jogador jog = jogadoresMapa[dados[0]]; jog.momento = DateTime.Now; } if (conectado) { String nick = txtApelido.Text; String nome = txtNome.Text; int tamanho = 6 + nick.Length + nome.Length; String mensagemEnvio = String.Format("02{0:D3}{1}|{2}", tamanho, nick, nome); byte[] bytes = Encoding.ASCII.GetBytes(mensagemEnvio); sock.SendTo(bytes, 0, bytes.Length, SocketFlags.None, ep); } break; case 2: tratarMsg02(data); break; } } sock.Close(); }); threadLeitoraBroadcast.Start(); }
private void tratarMsg02(byte[] retorno) { string stringData = Encoding.ASCII.GetString(retorno); int tipoMsg = Int32.Parse(stringData.Substring(0, 2)); int tamanhoMsg = Int32.Parse(stringData.Substring(2, 3)); String mensagem = stringData.Substring(5, tamanhoMsg - 5); String[] dados = mensagem.Split('|'); if (!jogadoresMapa.ContainsKey(dados[0])) { Jogador jog = new Jogador(); jog.apelido = dados[0]; jog.nome = dados[1]; jog.confirmado = true; jogadoresMapa.Add(jog.apelido, jog); } else { Jogador jog = jogadoresMapa[dados[0]]; jog.confirmado = true; } }