Retroceder   Foros del Web > Programación para sitios web > .NET > win forms

Respuesta
 
Herramientas Desplegado
Antiguo 20-nov-2005, 08:25   #1 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
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.
__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Antiguo 20-nov-2005, 10:06   #2 (permalink)
xknown está en el buen camino
 
Avatar de xknown
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.249
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
xknown está desconectado   Responder Citando
Antiguo 20-nov-2005, 10:44   #3 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
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.
__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Antiguo 20-nov-2005, 12:22   #4 (permalink)
xknown está en el buen camino
 
Avatar de xknown
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.249
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
xknown está desconectado   Responder Citando
Antiguo 20-nov-2005, 17:43   #5 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
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!.
__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Antiguo 20-nov-2005, 21:14   #6 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
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.
__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Antiguo 21-nov-2005, 09:43   #7 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
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!.
__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Antiguo 22-nov-2005, 16:19   #8 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
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!.



__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Antiguo 24-nov-2005, 13:39   #9 (permalink)
mariano_donati tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.137
Hola a todos, es así como se trabaja para enviar archivos binarios mediante sockets o no estoy entendiendo bien los conceptos?

Suerte!.
__________________
En el este y el oeste, en el Norte y en el sur, brilla la blanca y celeste, la academia Racing Club
mariano_donati está desconectado   Responder Citando
Respuesta
No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 04:43.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93