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

Instancia de una clase y un socket

Estas en el tema de Instancia de una clase y un socket en el foro de .NET en Foros del Web. hola, mi pregunta es la siguiente, se puede enviar una instancia de una clase mediante sockets para del otro lado recibirla y hacer uso de ...
  #1 (permalink)  
Antiguo 20/11/2005, 09:25
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Instancia de una clase y un socket

hola, mi pregunta es la siguiente, se puede enviar una instancia de una clase mediante sockets para del otro lado recibirla y hacer uso de la información contenida en ella?
Saludos a todos.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 20/11/2005, 11:06
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
La clave de eso es la des/serialización, sólo por curiosidad, qué estás haciendo? no sería mejor que usaras remoting o servicios web?

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 20/11/2005, 11:44
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Ah mira vos, siempre había oído hablar sobre ese tema, pero nunca me puse a leer bien de que se trataba, no sabía que podía estar relacionado con eso.
Te cuento que es lo que quiero hacer. Sigo con la aplicación de mensajería. En este momento estoy enviando los datos con formato xml, el servidor lo único que hace es redirigir ese mensaje al cliente correspondiente. A mi me gustaría que en lugar de mandar datos con xml, enviar clases que contiene la información relevante.
Te doy un ejemplo:
Cuando un cliente se conecta, el servidor dirige un mensaje en formato xml hacia todos los clientes con este formato:

<Event class='ClientConnected' Ip='la Ip del cliente' Id='Id del usuario' Nickname='alguno'/>

El cliente procesa esa cadena y genera el evento correspondiente.
Como se puede generar varios tipos de eventos, con distintos atributos, entonces enviar los datos con formato xml no me brinda flexibilidad, en cambio creando una clase correspondiente a cada evento, podría manejar mejor la situación.
El mismo caso, pero haciendolo con una clase, sería así:

Public Class ClientConnected

Private _Ip As String
Private _Nickname As String
Private _Datetime As Datetime
Private _Id As Integer

Public ReadOnly Property Id() As Integer
....
End Property

Public ReadOnly Property Nickname() As String
....
End Property

....

End Class

Entonces, al momento de generar el evento, en lugar de enviar una cadena xml, lleno las propiedades de esta clase y la envio, y en el cliente uso esta información para manejar el evento.

Pensas que se puede hacer con remoting?.
Saludos xknown.
__________________
Add, never Remove
  #4 (permalink)  
Antiguo 20/11/2005, 13:22
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Efectivamente, hay varios ejemplos al respecto. Para muestra de un botón mira http://www.codeguru.com/Csharp/Cshar...le.php/c10215/

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 20/11/2005, 18:43
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Un espectaculo lo suyo xknown, ya lo imprimí para analizarlo más tranquilo. Por el momento estoy tratando de mantenerlo lo más simple posible, usando la serialización y deserialización y los streams, pero me está llevando tiempo reestructurar parte de mi código ya que venía empleando puramente sockets.
Saludos!.
__________________
Add, never Remove
  #6 (permalink)  
Antiguo 20/11/2005, 22:14
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Estoy tratando de lograr esto, ya reestructure todo mi código, pero ahora me aparecen nuevos problemas. Lo que hago es serializar-deserializar el NetworkStream del TcpClient.

Estos son los pasos que sigo:

Lado cliente:

- El cliente envia decide enviar un mensaje
- El texto del mensaje se agrega como información a la clase Message, junto a otras propiedades
- Serializo esta clase

Lado servidor:

- Recibo el stream
- Lo deserializo --> acá es donde está el problema

Me larga System.IO.NotFileFoundException.

Es posible hacerlo de esa forma?. La otra alternativa que se me ocurre es serializar el objeto y guardarlo en un archivo .dat, y enviar este archivo al servidor y que este sea el archivo por deserializar, pero no se si eso será correcto, y de hecho, como se hace para mandar un archivo .dat o .bin a través de un socket? alguien conoce algún ejemplo?.
Muchas gracias por al menos seguir leyendo mis mensajes como siempre.
Saludso a todos.
__________________
Add, never Remove
  #7 (permalink)  
Antiguo 21/11/2005, 10:43
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Bueno pude solucionarlo al final enviando el archivo binario mediante sockets. Ahora lo que hago es así:

-Serializo el objeto
-Lo guardo en un archivo .bin
-Genero una matriz de bytes con el archivo
-Envio esta matriz al servidor
-Con la matriz recibida genero el archivo .bin en el servidor
-Y deserializo el objeto a partir de este archivo

Si a alguien le interesa el código, que me avise así lo pongo, para no poner cosas que quizás no le importen a nadie.

Saludos!.
__________________
Add, never Remove
  #8 (permalink)  
Antiguo 22/11/2005, 17:19
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
EStoy teniendo problemas al intentar escribir los bytes que recibo desde el cliente en un archivo binario en el servidor.
Estos son los procedimientos que utilizo:

PrivateFunction GetBytesFromBinaryFile(ByVal F AsString) AsByte()

Dim FileStream AsNew FileStream(F, FileMode.Open)

Dim BinaryReader AsNew BinaryReader(FileStream)

Dim BytesRead() AsByte = BinaryReader.ReadBytes(BinaryReader.BaseStream.Length)

BinaryReader.Close()

FileStream.Close()

DeleteCreatedBinaryFile(F)

Return BytesRead

EndFunction


PrivateFunction GetBinaryFileFromBytes(ByVal F AsString, ByVal Bytes() AsByte) As FileStream

Dim FileStream AsNew FileStream(F, FileMode.Create)

Dim BinaryWriter AsNew BinaryWriter(FileStream)

BinaryWriter.Write(Bytes, 0, Bytes.Length)

FileStream.Close()

BinaryWriter.Close()

Return FileStream

EndFunction


El primer procedimiento lo utilizo para extraer los bytes de un archivo binario. Este archivo binario es el que guarda el objeto serializado, y estos bytes devueltos por la función son los que van a ser enviados mediante el stream.
El segundo procedimiento me devuelve un objeto FileStream. Tiene como argumento la ruta del archivo que se va a crear y los bytes que se deben escribir en este archivo. Estos bytes son los que recibe el servidor por parte del cliente (que son los bytes sacados de la primera función y que fueron enviados). Entonces, al devolver esta función un FileStream, la utilizo directamente como agumento para deserializar el objeto de esta forma:

Dim MyObject As Object = CType(BinaryFormatter.Deserialize(GetBinaryFileFromByte s("RUTADELARCHIVO","BYTESRECIBIDOS")), Object)


Pero al ejecutar esta linea me salta error, más precisamente este:

Excepción no controlada del tipo 'System.ArgumentException' en mscorlib.dll
Información adicional: No se puede leer la secuencia.

Y se produce justo al intentar ejecutar esta linea correspondiente a la función GetBinaryFileFromBytes():

BinaryWriter.Write(Bytes, 0, Bytes.Length)


Estoy haciendo lo correcto?, ven algún error?

Muchas gracias por su ayuda.

Saludos!.



__________________
Add, never Remove
  #9 (permalink)  
Antiguo 24/11/2005, 14:39
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Hola a todos, es así como se trabaja para enviar archivos binarios mediante sockets o no estoy entendiendo bien los conceptos?

Suerte!.
__________________
Add, never Remove
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




La zona horaria es GMT -6. Ahora son las 01:28.