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.
| |||
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 |
| ||||
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 |
| |||
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 |
| ||||
Efectivamente, hay varios ejemplos al respecto. Para muestra de un botón mira http://www.codeguru.com/Csharp/Cshar...le.php/c10215/ Saludos |
| |||
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 |
| |||
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 |
| |||
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 |
| |||
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 |