Sockets en C# (Parte 2)

Buenas a todos, esta es la segunda parte del tutorial sobre sockets en c#.
Para los que no vieron la primera parte acá se las dejo:

Sockets en C# (Parte 1)

En esta nueva entrega veremos como enviar y recibir texto.

Para ello crearemos el cliente y servidor, y lo conectaremos. Como vimos antes.

Para enviar

Algo ah tener en cuenta, es que el texto que queremos enviar, debe ser convertido en un array de bytes. Para ello utilizamos la clase Encoding.

 
byte[] txtAEnviar;    // creamos una array de byte
 txtAEnviar = Encoding.Default.GetBytes(texto);  // De esa manera pasamos a bytes el texto (string)

Una vez hecho lo anterior lo que queda es enviarlo. Para ello utilizaremos el socket que creamos y usamos su metodo Send().
Este método tiene algunos parametros:

miPrimerSocket.Send(a,b,c,d);
//a -> el array de bytes 
//b -> Posición del array de donde comienza a enviar
//c -> Tamaño del array. Esto se consigue con la propiedad Length
//d -> Especifica los comportamientos de envío y recepción del socket.Nosotros pondremos 0
//Nos quedaria así
miPrimerSocket.Send(txtAEnviar, 0, txtAEnviar.Length,0);

Para recibir

Primero antes que nada debemos crear el array de bytes, en esta primera medida le pondremos una tamaño de 255, Hay que tener en cuenta que si el cliente manda un array mayor habrá un error. Una solución seria primero mandar el tamaño del array y luego el array en sí. Pero ahora no viene al caso ya que es solo un ejemplo

byte[] byARecibir = new byte[255];

Ahora recibimos el array de bytes con el metodo del socket, Receive(). Este metodo devuelve un entero que luego usaremos

int enteroRecibido = miPrimerSocket.Receive(ByRec, 0, ByRec.Length, 0); 
//Los parametros son los mismos que los del metodo Send
//En el servidor usariamos el socket que usamos en la entrega anterior, osea, "Escuchar"

Ahora usariamos el metodo Resize de la clase Array para cambiar el numero de elementos de nuestro array en base al retorno del metodo Receive, ya que antes teniamos 255. Pero debemos pasarle el array por referencia.

Array.Resize(ref ByRec, enteroRecibido);

y listo, solo ahora queda pasar nuestro array de bytes a texto de la siguiente manera

string texto;
texto = Encoding.Default.GetString(ByRec)

Eso es todo por ahora, les dejo el ejemplo. Saludos!

Cliente

class Program
    {
        static void Main(string[] args)
        {
            Conectar();
        }
        public static void Conectar()
        {
            Socket miPrimerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint miDireccion = new IPEndPoint(IPAddress.Parse("192.168.0.11"), 1234);

            string texto;
            byte[] textoEnviar;

            try
            {
                miPrimerSocket.Connect(miDireccion);
                Console.WriteLine("Conectado con exito");

                Console.WriteLine("Ingrese el texto a enviar al servidor: ");
                texto = Console.ReadLine(); //leemos el texto ingresado 
                textoEnviar = Encoding.Default.GetBytes(texto); //pasamos el texto a array de bytes
                miPrimerSocket.Send(textoEnviar, 0, textoEnviar.Length,0); // y lo enviamos
                Console.WriteLine("Enviado exitosamente");

                miPrimerSocket.Close();
            }
            catch (Exception error)
            {
                Console.WriteLine("Error: {0}", error.ToString());
            }
            Console.WriteLine("Presione cualquier tecla para terminar");
            Console.ReadLine();
        }

Servidor

public static void Conectar()
        {
            byte[] ByRec;
            Socket miPrimerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint miDireccion = new IPEndPoint(IPAddress.Any, 1234);

            byte[] ByRec; 
            try
            {
                miPrimerSocket.Bind(miDireccion);
                miPrimerSocket.Listen(1);

                Console.WriteLine("Escuchando...");
                Socket Escuchar = miPrimerSocket.Accept();
                Console.WriteLine("Conectado con exito");

                ByRec = new byte[255]; 
                int a = Escuchar.Receive(ByRec, 0, ByRec.Length, 0);
                Array.Resize(ref ByRec, a);
                Console.WriteLine("Cliente dice: " + Encoding.Default.GetString(ByRec)); //mostramos lo recibido
                miPrimerSocket.Close();

            }
            catch (Exception error)
            {
                Console.WriteLine("Error: {0}", error.ToString());
            }
            Console.WriteLine("Presione cualquier tecla para terminar");
            Console.ReadLine();

        }

Acerca del autor:

Twitter del autor:

13 comments

  1. puraternurita says:

    Muchas Gracias por el gran aporte, lo he ejecutado y funciona. La duda es que no el servidor no puede enviar una respuesta y el cliente no la puede recibir.
    Allí aplique un bucle y le deje una conexión de ingreso dato y recibe y no me deja aun así.

  2. Brand says:

    De la misma manera puedo enviar un mensaje desde el servidor al cliente?. Gracias.

  3. hynfra says:

    Hola como hago para que 2 clientes interactuen en el servidor como un chat? gracias

  4. lOGAN says:

    Hola como puedo hacerle para que en vez que reciba string reciba un int ?

  5. Eder says:

    Hola amigo.. Muchas Gracias por el Aporte::. Me ha servido de mucho.. Gracias

  6. jorge says:

    Para configurarlo el servidor y pueda recibir de varios clientes?

  7. Max says:

    Hola oye como puedo hacerle con este mismo código mandar archivos .txt de un cliente a un servidor

    • AndresS5 says:

      Primero carga el archivo de texto con los metodos convencionales y guardalo en una variable de tipo string. Luego lo conviertes como dicen aqui asi
      byte[] txtAEnviar; // creamos una array de byte
      2
      txtAEnviar = Encoding.Default.GetBytes(Aqui la variable que contiene el archivo de texto); // De esa manera pasamos a bytes el texto (string)

      Luego en el programa que lo reciba tomas la cadena de texto decodificada string y la guardas como .txt con los metodos convencionales.
      Listo.

      GG

  8. roger says:

    hola, como puedo enciclar el servidor infinitamente para que nunca termine?

    gracias

  9. adal says:

    oye muy buen post, una pregunta, como debo hacer para dar una orden a una cliente, es decir que la pueda apagar o suspender desde el servidor, saludos

    • ovejardo says:

      y le podrías enviar un string ya planeado para ese fin en ambos proyectos, por ejemplo “” o algo así. Y desde el servidor después de que reciba, poner un
      if (textoRecivido.IndexOf(“”) > -1)
      //osea si encuentra esa cadena en el string recibido, ejecutaria lo que quieras hacer
      {
      miSocket.Close();

      }
      El metodo IndexOf devuelve -1 si no encuentra, y si encuentra, devuelve el indice de cuando aparece
      Espero que halla respondido tu pregunta. Saludos

Leave a Reply to roger Cancel reply

Your email address will not be published. Required fields are marked *