2011-06-02 10 views
5

Soy bastante nuevo en la serialización así que por favor tengan paciencia conmigo.¿Cómo obtengo una secuencia de objetos TCP asincrónica en C#?

Quiero dos instancias de mi aplicación para comunicarme entre sí a través de Internet. Logré establecer una relación cliente/servidor TCP y usé un formateador binario para intercambiar un par de mensajes. Aquí está el lado del cliente ...

using (TcpClient clientSocket = new TcpClient(ipAddress, currentPort)) 
{ 
    using (NetworkStream stream = clientSocket.GetStream()) 
    { 
     // send 
     bformatter.Serialize(stream, new Message()); 

     // recv 
     return (Message)bformatter.Deserialize(stream); 
    } 
} 

Está bien, pero no es muy útil para una aplicación que necesita para enviar mensajes en respuesta a los eventos de usuario. Entonces necesito poder enviar y recibir de forma asíncrona.

Quiero básicamente una interfaz que se comporta de esta manera:

class BidirectionalObjectStream 
{ 
    public BidirectionalObjectStream(TcpClient client) 
    { 
     //... 
    } 

    // objects go in here 
    public void SendObject(object o) 
    { 
     //... 
    } 

    // objects come out here 
    public event Action<object> ObjectReceived; 
} 

¿Hay una clase como esta que es parte de .NET? Si no, ¿cómo debería implementar el evento de recepción? Tal vez un hilo dedicado llamando bformatter.Deserialize() en varias ocasiones ...?

Cualquier ayuda apreciada.

+0

"usé un formateador binario" No hagas esto a menos que confíes 100% en tu compañero de comunicación. 'BinaryFormatter' permite el acceso de bajo nivel a los campos y, por lo tanto, lo más probable es que permita la ejecución de código arbitrario en el contexto de su programa para el emisor de un mensaje. Considere usar json o protobuf para sus mensajes. – CodesInChaos

Respuesta

1

La pregunta es un poco amplia.

puedo pensar en dos opciones:

  • Uso socket asincrónico. Using an Asynchronous Client Socket
  • Cree subprocesos separados para recibir y enviar. Hay muchas maneras de lograrlo, Raw Thread, ThreadPool, delegate.Invoke, nuevas características de TPL como Task y Parallel.
Cuestiones relacionadas