problema con timer

Moderador: raul338

C#, tambien llamado C Sharp

problema con timer

Notapor yamandu » Sab May 22, 2010 4:14 pm

Buenas!
tengo un problema con un juego de bingo... tengo un servidor y un cliente...
cuando se conecta un cliente1 el servidor le envia bolas con un timer pero si se conecta el cliente2 el timer deja de funcionar en el cliente1 y funciona en el cliente2 alguien me podria ayudar con el tema timer???
aqui les dejo el codigo del servidor:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Collections;
using System.IO;
using System.Timers;

namespace ServidorBingo
{
public partial class FormServidor : Form
{
public class Paquet
{
public System.Net.Sockets.Socket socketActual;
public byte[] bufferDeDades = new byte[1024];

}
private List<Socket> socketsDeTreball = new List<Socket>();
public AsyncCallback funcioCallbackSocketDeTreball;

private Socket socketPrincipal;
private SortedList<int,Jugador> jugadoresRegistrados;
private SortedList listaCartones;
private int proximoID;
Random rd = new Random();
Paquet unPaquete;
Bombo elBombo;
int contador;
bool parartimer= true;


private System.Timers.Timer aTimer;




// Aquest delegat permet crides assíncrones per assignar
// la propietat text d'una etiqueta.
delegate void AssignaTextCallback(string text);
delegate void AssignaTextBoxCallback(string text, TextBox tb);
delegate void AssignaListCallback(string text);
delegate void AssignaListBoxCallback(string text, ListBox lst);
//delegate void AssignaTimerCallback(Timer tmr);

public FormServidor()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;


unPaquete = new Paquet();
elBombo = new Bombo();
leerProximoID();
aTimer = new System.Timers.Timer(1000);
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 2000;
aTimer.Enabled = true;
contador = 0;
txtIP.Text = ObtenirIP();
CargarJugadores();
LeeFicheroCartones();

//txtRecepcio.Text = "IP del servidor: " + ObtenirIP();
}
private string ObtenirIP()
{
String nomHost = Dns.GetHostName();

// Trobar el host pel nom
IPHostEntry iphostentry = Dns.GetHostEntry(nomHost);

// Prendre la primera adreça IP
String primeraIP = "";
//foreach (IPAddress adreçaIP in iphostentry.AddressList)
//{
// primeraIP = primeraIP+ "/n" + adreçaIP.ToString();
//}
primeraIP = iphostentry.AddressList[0].ToString();
return primeraIP;
//return "127.0.0.1";
}

private void btnIniciar_Click(object sender, EventArgs e)
{
int port;

if (btnIniciar.Text != "Iniciar")
{
TancaSockets();
btnIniciar.Text = "Iniciar";
}
else
{
try
{
//Recuperem el valor del port
port = (int)nudPort.Value;

// Crea el socket d'escolta ...
socketPrincipal = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Parse(ObtenirIP()), port);

// Lligam amb l'adreça IP local
socketPrincipal.Bind(ipLocal);

//Comença a escoltar
socketPrincipal.Listen(10);

// Crea el callback per a qualsevol connexió client...
socketPrincipal.BeginAccept(new AsyncCallback(OnClientConnect), null);



}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
btnIniciar.Text = "Parar";
}

}
public void OnClientConnect(IAsyncResult resultatAsync)
{
Socket socketTemporal;
try
{
// Aquí completem/finalitzem la crida asíncrona BeginAccept()
//cridant a EndAccept(), que retorna una referència a un now
//objecte de la classe socket.
socketTemporal = socketPrincipal.EndAccept(resultatAsync);

socketsDeTreball.Add(socketTemporal);

// Deixem que el socket de treball faci la resta del procés amb el client
// que s'acaba de connectar.
EsperaDades(socketsDeTreball[socketsDeTreball.Count - 1]);

// Incrementem el número de clients
//nClients ++;
//System.Threading.Interlocked.Increment(ref nClients);

// Mostrem aquesta connexió de client com a missatge d'estat en el formulari

// Com que el socket principal ara està lliure, resta disponible
// per escoltar a altres clients que volen connectar-se
socketPrincipal.BeginAccept(new AsyncCallback(OnClientConnect), null);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: S'ha tancat el socket\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}

}
private void EsperaDades(Socket socket)
{
try
{
if (funcioCallbackSocketDeTreball == null)
{
// Especifica la funció de callback la qual serà invocada
// quan hi hagi activació d'escriptura del client connectat
funcioCallbackSocketDeTreball = new AsyncCallback(OnDataReceived);
}
Paquet unPaquet = new Paquet();
unPaquet.socketActual = socket;

// Començar a rebre qualsevol dada escrita pel client de manera asíncrona
socket.BeginReceive(unPaquet.bufferDeDades, 0,
unPaquet.bufferDeDades.Length,
SocketFlags.None,
funcioCallbackSocketDeTreball,
unPaquet);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
public void OnDataReceived(IAsyncResult resultatAsync)
{
int elId = 0;
double dineroLinea = 500;
double dineroBingo = 1000;
int cartonJugador, cartonMaquina;
Jugador elJugador=new Jugador(0,"","",0);
Jugador auxJugador;
Partida laPartida = null;
List<Jugador> listaJugadores = new List<Jugador>();
string[] tractaDades;
string[] taula;
bool trobat=false;



try
{
Paquet dadesDelSocket = (Paquet)resultatAsync.AsyncState;
unPaquete = dadesDelSocket;
int iRx = 0;

// Completa la crida asíncrona BeginReceive () amb el mètode EndReceive()
// el qual retorna el número de caràcters escrits en el stream pel client
iRx = dadesDelSocket.socketActual.EndReceive(resultatAsync);
char[] chars = new char[iRx + 1];
System.Text.Decoder decodificador = System.Text.Encoding.UTF8.GetDecoder();
int llargadaCars = decodificador.GetChars(dadesDelSocket.bufferDeDades,
0, iRx, chars, 0);
System.String dades = new System.String(chars);
ActualitzaListBox(dades, lstRecepcio);
//ActualitzaTimer(tmrBola);

taula = dades.Split('|');

for (int i = 0; i < taula.Length; i++)
{
tractaDades = taula[i].Split(';');

if (tractaDades[0] == "Nick")
{
//CambiarNick
}
else if (tractaDades[0] == "Identificar")
{

elId = Identificar(tractaDades[1], tractaDades[2]);
if (elId != 0)
{


for(i=0;i< jugadoresRegistrados.Count;i++)
{
auxJugador = jugadoresRegistrados.ElementAt(i).Value;
if (auxJugador.Id == elId)
{
elJugador = auxJugador;
EnviarDatos("Identificador;" + elId + ";Fin;", dadesDelSocket.socketActual);

}
}
if (elJugador.Nombre != "")
{
elJugador.Socket = dadesDelSocket.socketActual;
String str = String.Format("S'ha connectat el client # {0}", elJugador.Nombre);
lblStatus.Text = str;
}



}
else
{
EnviarDatos("Accion;Desconectar;Fin", dadesDelSocket.socketActual);
String str = String.Format("S'ha intentat connectar el client # {0}, error de identificacion", tractaDades[1]);
lblStatus.Text = str;
}

}
else if (tractaDades[0] == "Registrar")
{
if (tractaDades[1] != "" && tractaDades[2] != "")
{
i=0;
while(!trobat && i<jugadoresRegistrados.Count)
{
auxJugador = jugadoresRegistrados.ElementAt(i).Value;
if (auxJugador.Nombre==tractaDades[1])
{
trobat=true;
EnviarDatos("Identificador;"+auxJugador.Id+";Fin;", dadesDelSocket.socketActual);
}
i++;

}
if(!trobat)
{
jugadoresRegistrados.Add(proximoID, new Jugador(proximoID, tractaDades[1], tractaDades[2], 100));
EnviarDatos("UsuarioNoRegistrado;" + proximoID + ";Fin;", dadesDelSocket.socketActual);
AugmentarProximoID();
GuardarJugadores();



}
}

}

else if (tractaDades[0] == "Jugar")
{




// 1 envia el id;
if (tractaDades[1] != "0")
{


if (laPartida == null)
{


cartonJugador = rd.Next(1, listaCartones.Count);
cartonMaquina = 3;
while (cartonMaquina == cartonJugador)
{
cartonMaquina = rd.Next(1, listaCartones.Count);
}

elJugador = jugadoresRegistrados[Convert.ToInt16(tractaDades[1])];
laPartida = new Partida((Carton)listaCartones.GetByIndex(cartonMaquina), (Carton)listaCartones.GetByIndex(cartonJugador));
elJugador.NuevaPartida(laPartida);
elJugador.Socket = dadesDelSocket.socketActual;
listaJugadores.Add(elJugador);

foreach (Jugador unJugador in listaJugadores)
{

unJugador.DisminuirDinero(Convert.ToDouble(tractaDades[2]));
EnviarDatos("Dinero;" + unJugador.Dinero + ";Fin;", unJugador.Socket);
EnviarDatos("Jugar;" + laPartida.CartonJugador() + ";Fin;", unJugador.Socket);


}
EnviarDatos("JugarMaquina;" + laPartida.CartonMaquina() + ";Fin;", elJugador.Socket);
parartimer = false;

}


}
}

else if (tractaDades[0] == "Final")
{
laPartida = null;
parartimer = true;


}

else if (tractaDades[0] == "Linia")
{
elJugador = jugadoresRegistrados[Convert.ToInt16(tractaDades[1])];
elJugador.Socket = dadesDelSocket.socketActual;
EnviarDatos("DineroLinea;" + elJugador.AugmentarDinero(dineroLinea) + ";Fin;", dadesDelSocket.socketActual);


}
else if (tractaDades[0] == "Bingo")
{
elJugador = jugadoresRegistrados[Convert.ToInt16(tractaDades[1])];
elJugador.Socket = dadesDelSocket.socketActual;
EnviarDatos("DineroBingo;" + elJugador.AugmentarDinero(dineroBingo) + ";Fin;", dadesDelSocket.socketActual);


}
}

// Continua la espera de dades en el socket

EsperaDades(dadesDelSocket.socketActual);


}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: El socket ha estat tancat\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}

private void btnSalir_Click(object sender, EventArgs e)
{
TancaSockets();
Close();
}
private void TancaSockets()
{
if (socketPrincipal != null)
{
socketPrincipal.Close();
}
Jugador jugadorActual;
for(int i=0;i<jugadoresRegistrados.Count;i++)
{
jugadorActual = jugadoresRegistrados.ElementAt(i).Value;
if (jugadorActual.Socket != null)
jugadorActual.Socket.Close();
}
}

#region Delegats


private void OnActualitzaListBox(string str, ListBox lst)
{
lst.Items.Add(str);
}
private void ActualitzaListBox(string str, ListBox lst)
{
if (InvokeRequired)
{
object[] llistaParametres = { str, lst };
lst.BeginInvoke(new AssignaListBoxCallback(OnActualitzaListBox), llistaParametres);
}
else
{
OnActualitzaListBox(str, lst);
}
}
private void OnActualitzaTextBox(string str, TextBox tb)
{
tb.Text = str;
}
private void ActualitzaTextBox(string str, TextBox tb)
{
if (InvokeRequired)
{
object[] llistaParametres = { str, tb };
tb.BeginInvoke(new AssignaTextBoxCallback(OnActualitzaTextBox), llistaParametres);
}
else
{
OnActualitzaTextBox(str, tb);
}
}
#endregion

private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
this.Show();
this.WindowState = FormWindowState.Normal;
//Ocultamos el icono de la bandeja de sistema
notifyIcon1.Visible = false;
}

private void FormServidor_Resize(object sender, EventArgs e)
{
//Si el estado actual de la ventana es "minimizado"...
if (this.WindowState == FormWindowState.Minimized)
{
//Ocultamos el formulario
this.Visible = false;
//Hacemos visible el icono de la bandeja del sistema
notifyIcon1.Visible = true;
}
}

private void CargarJugadores()
{
string[] idJugadores;
Jugador jugadorActual;
StreamReader sr;
idJugadores = Directory.GetFiles("config//usuarios//", "*.usuario");
jugadoresRegistrados = new SortedList<int, Jugador>();
for (int i = 0; i < idJugadores.Length; i++)
{
sr = new StreamReader(idJugadores[i]);
jugadorActual = new Jugador(Convert.ToInt32(sr.ReadLine()), sr.ReadLine(), sr.ReadLine(), Convert.ToDouble(sr.ReadLine()));
jugadoresRegistrados.Add(jugadorActual.Id, jugadorActual);
sr.Close();
}
}

private void GuardarJugadores()
{
Jugador jugadorActual;
StreamWriter sw;

for (int i = 0; i < jugadoresRegistrados.Count; i++)
{
jugadorActual = jugadoresRegistrados.ElementAt(i).Value;
sw = new StreamWriter("config//usuarios//" + jugadorActual.Id + ".usuario");
sw.WriteLine(jugadorActual.Id);
sw.WriteLine(jugadorActual.Nombre);
sw.WriteLine(jugadorActual.Constraseña);
sw.Write(jugadorActual.Dinero);
sw.Close();
}
}

private int Identificar(string nombre, string contraseña)
{

//retorna 0 si no el troba
Jugador jugadorActual;
int id = 0;
for (int i = 0; i < jugadoresRegistrados.Count; i++)
{
jugadorActual = jugadoresRegistrados.ElementAt(i).Value;
if (jugadorActual.Nombre == nombre && jugadorActual.Constraseña == contraseña)
id = jugadorActual.Id;
}
return id;
}

private void LeeFicheroCartones()
{
Carton cartonActual;
string[] taulaCartons;
StreamReader sr;
listaCartones = new SortedList();
taulaCartons = Directory.GetFiles("config//cartones", "*.carton");

for (int i = 0; i <= taulaCartons.Length - 1; i++)
{
sr = new StreamReader(taulaCartons[i]);
cartonActual = new Carton(taulaCartons[i]);
listaCartones.Add(i + 1, cartonActual);
}
}


private void leerProximoID()
{
StreamReader sr = new StreamReader("config//sbingo.config");
proximoID = Convert.ToInt32(sr.ReadLine());
sr.Close();
}

private void AugmentarProximoID()
{
StreamWriter sw = new StreamWriter("config//sbingo.config");
proximoID++;
sw.Write(proximoID);
sw.Close();
}
private void EnviarDatos(Object objDades, Socket socketUsuari)
{
try
{
byte[] dades = System.Text.Encoding.ASCII.GetBytes(objDades.ToString());
if (socketUsuari != null)
{
socketUsuari.Send(dades);

}
}
catch (SocketException se)
{
lblStatus.Text = se.Message; ;
}
}

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
if (parartimer == false)
{
if (contador == elBombo.taulaBolas.Length)
{

contador = 0;
elBombo = new Bombo();
EnviarDatos("Bola;" + elBombo.taulaBolas[contador] + ";Fin;", unPaquete.socketActual);

}
else
{
EnviarDatos("Bola;" + elBombo.taulaBolas[contador] + ";Fin;", unPaquete.socketActual);
contador++;
}
}
}
}
}
yamandu
Novato
Novato
 
Mensajes: 1
Registrado: Sab May 22, 2010 4:03 pm


    

Volver a C#

¿Quién está conectado?

Usuarios navegando por este Foro: Filessika y 0 invitados