Tema: chat en C#
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/06/2008, 12:22
sbrenesms
(Desactivado)
 
Fecha de Ingreso: enero-2008
Mensajes: 15
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: chat en C#

namespace Broadcast_utilizando_UDP
{
public partial class frmMain : Form
{
#region "Variables"
//Variable de objeto que contiene el socket
Socket ElSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//Variable que contiene al hilo encargado de recibir los datos
Thread HiloRecibir;

//Variable que indica si el programa se está cerrando
bool Saliendo = false;

//Variables temporales para almacenar los datos recibidos
string DireccIP; string ContenidoMensaje;
#endregion

public frmMain()
{
InitializeComponent();
}

private void txtMensaje_TextChanged(object sender, EventArgs e)
{
//Cuando txtMensaje esté vacío, deshabilitar el botón de envío.
cmdEnviar.Enabled = (txtMensaje.TextLength > 0);
}

private void cmdEnviar_Click(object sender, EventArgs e)
{
//Contiene la dirección de Broadcast y el puerto utilizado
IPEndPoint DirecciónDestino = new IPEndPoint(IPAddress.Broadcast, 20145);
//Buffer que guardará los datos hasta que se envíen
byte[] DatosBytes = Encoding.Default.GetBytes(txtMensaje.Text);

//Envía los datos
ElSocket.SendTo(DatosBytes, DatosBytes.Length, SocketFlags.None, DirecciónDestino);

txtMensaje.Clear(); //Limpia txtMensaje
txtMensaje.Focus(); //Mueve el foco hacia txtMensaje
}

private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
Saliendo = true; //Indica que se está saliendo del programa
ElSocket.Close(); //Cierra el socket
HiloRecibir.Abort(); //Termina el proceso del hilo
}

private void frmMain_Load(object sender, EventArgs e)
{
//Separamos el puerto 200145 para usarlo en nuestra aplicación
ElSocket.Bind(new IPEndPoint(IPAddress.Any, 20145));
//Habilitamos la opción Broadcast para el socket
ElSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
HiloRecibir = new Thread(RecibirDatos); //Crea el hilo
HiloRecibir.Start(); //Inicia el hilo
}

private void RecibirDatos()
{
//Mientras el inidicador de salida no sea verdadero
while(!Saliendo){
//Variable para obtener la IP de la máquína remitente
IPEndPoint LaIPRemota = new IPEndPoint(IPAddress.Any, 0);
//Variable para almacenar la IP temporalmente
EndPoint IPRecibida = (EndPoint)LaIPRemota;
byte[] RecibirBytes = new byte[256]; //Buffer
string Datos = ""; //Texto a mostrar

try{
//Recibe los datos
ElSocket.ReceiveFrom(RecibirBytes, RecibirBytes.Length, SocketFlags.None, ref IPRecibida);
//Los convierte y lo guarda en la variable Datos
Datos = Encoding.Default.GetString(RecibirBytes);
}catch (SocketException ex){
if(ex.ErrorCode == 10040){ //Datos muy largos
Datos += "[truncado]"; //Añade la cadena "[truncado]" al texto recibido
}else{
//Muestra el mensaje de error
MessageBox.Show("Error '" + ex.ErrorCode + "' " + ex.Message,"Error al recibir los datos", MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}

//Convierte el tipo EndPoint a IPEndPoint con sus respectivas variables
LaIPRemota = (IPEndPoint)IPRecibida;
//Guarda los datos en variables temporales
DireccIP = LaIPRemota.Address.ToString();
ContenidoMensaje = Datos.ToString();

//Invoca al evento que mostrará los datos en txtDatosRecibidos
txtDatosRecibidos.Invoke(new EventHandler(ActualizarTextoMensaje));
}
}

private void txtDatosRecibidos_TextChanged(object sender, EventArgs e)
{
//Mostrar siempre la última línea del TextBox.
txtDatosRecibidos.SelectionStart = txtDatosRecibidos.TextLength;
txtDatosRecibidos.ScrollToCaret();
}

protected void ActualizarTextoMensaje(object sender, EventArgs e)
{
//Si txtDatosRecibidos está vacío:
if(txtDatosRecibidos.TextLength == 0){
txtDatosRecibidos.Text = DireccIP + ">" + ContenidoMensaje;
}else{
//de lo contrario insertar primero un salto de línea y luego los datos.
txtDatosRecibidos.Text += "\r\n" + DireccIP + ">" + ContenidoMensaje;
}
}

}
}