Foros del Web » Programación para mayores de 30 ;) » .NET »

¿Pasar objetos por sockets?

Estas en el tema de ¿Pasar objetos por sockets? en el foro de .NET en Foros del Web. Necesito ayuda para pasar un objeto por medio de sockets. Estoy haciendo una aplicación cliente servidor, y necesito enviar un objeto de un lado a ...
  #1 (permalink)  
Antiguo 09/11/2010, 23:34
 
Fecha de Ingreso: abril-2010
Mensajes: 31
Antigüedad: 14 años, 8 meses
Puntos: 1
¿Pasar objetos por sockets?

Necesito ayuda para pasar un objeto por medio de sockets. Estoy haciendo una aplicación cliente servidor, y necesito enviar un objeto de un lado a otro usando sockets, esto ya lo he hecho en java, pero es mi primera vez usando sockets en c# y como es de esperar, estoy teniendo problemas con eso.

Este es el código del servidor:

Código c#:
Ver original
  1. public void enviar()
  2.         {
  3.             try
  4.             {
  5.                 //Hago la coneccion al socket, todo perfecto hasta aqui
  6.  
  7.                  //Creo el objeto para enviar
  8.                 Persona p = new Persona(12345, "Juan Perez", "22222222");
  9.  
  10.                 NetworkStream tream = new NetworkStream(socket);
  11.                 StreamReader reader = new StreamReader(stream);
  12.                 StreamWriter writer = new StreamWriter(stream);
  13.                 BinaryFormatter bf = new BinaryFormatter();
  14.  
  15.                 Console.WriteLine("Sending data to server...");
  16.                
  17.                 bf.Serialize(stream, p);
  18.  
  19.                 //Leo la respuesta del servidor
  20.                
  21.                 //Cierro los stream y sockets
  22.  
  23.             }
  24.             catch (Exception ex)
  25.             {
  26.                 Console.WriteLine("An error has ocurred while connecting to the server.");
  27.             }
  28.         }

Y aquí el código del servidor:

Código c#:
Ver original
  1. public void recibir()
  2.         {
  3.             try
  4.             {
  5.                 //Establezco la conexion con el cliente.
  6.  
  7.                 while (true)
  8.                 {
  9.                     //Acepto la conexion, hasta aqui todo perfecto.
  10.  
  11.                     NetworkStream stream = new NetworkStream(socket);
  12.                     StreamReader reader = new StreamReader(stream);
  13.                     StreamWriter writer = new StreamWriter(stream);
  14.                     BinaryFormatter bf = new BinaryFormatter();
  15.  
  16.                     Console.WriteLine("Reading client data");
  17.                     Persona p = (Persona)(bf.Deserialize(stream));
  18.  
  19.                    //Envio la respuesta al cliente
  20.  
  21.                    //Cierro los stream y sockets
  22.                 }
  23.             }
  24.             catch (Exception ex)
  25.             {
  26.                 Console.WriteLine("An error has ocurred while executing the server.");
  27.             }
  28.         }

El problema es que del lado del sevidor, me genera una excepcion (System.Runtime.Serialization.SerializationExcepti on) cuando intento deserializar el objeto ¨Persona¨.

Cabe mencionar que la clase Persona está marcada como serializable, así que dudo que sea por eso.

Si alguien sabe como resolver esto, agradezco mucho su ayuda.
  #2 (permalink)  
Antiguo 12/11/2010, 11:52
 
Fecha de Ingreso: noviembre-2010
Mensajes: 7
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ¿Pasar objetos por sockets?

Hola,

No se si lo conoces la librería de remoting de .NET, pero permite hacer esta serialización de forma automática (por suerte, también permite customizarla ya que en algunos casos no es demasiado óptima )

Si tu aplicación requiere usar el socket directamente lo que podrías hacer, es crear una clase que compartieran cliente y servidor y se encargara de serializar y deserializar manualmente esos objetos sobre el socket. Es decir:

Código:
public class SerializedPersona
{
   public static void Serialize(BinaryWriter writer, Persona persona)
  {
    writer.Write(persona.Nombre);
    writer.Write(persona.Edad);
  }

   public static Persona Deserialize(BinaryReader reader)
  {
    Persona persona = new Persona();
    persona.Nombre = reader.ReadString();
    persona.Edad = reader.ReadInt16();
    return persona;
  }
}
Saludos!

Etiquetas: objetos, pasar, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:07.