2010-07-24 18 views
8

deseo de desarrollar una aplicación cliente-servidor en .NET que funciona de la siguiente manera:¿Debo usar WCF o conectores crudos?

  1. Los clientes se conectan a un servidor central. El servidor necesita realizar un seguimiento de los clientes que se conectan, y debe permitir solo a los que conoce (tengo un repositorio de clientes permitidos). Esto se debe a que en mi aplicación, es fundamental saber quiénes están todos presentes en una instancia determinada.
  2. Los clientes podrían conectarse a otros dispositivos, por ejemplo, a través de puertos LAN/USB/Serial. El servidor debería poder controlar estos dispositivos conectados a través del cliente. Por ejemplo, supongamos que el cliente está conectado a una cámara. El servidor debería poder encender la cámara en un momento determinado y luego recuperar las imágenes (o hacer que el cliente lo haga y subir el resultado al servidor).
  3. También me gustaría la posibilidad de que estos clientes ejecuten ejecutables personalizados y obtengan el resultado. Por ejemplo, el servidor envía una aplicación (o invoca a algunas existentes) al cliente, hace que el cliente la ejecute y recupera los datos resultantes.

Me pregunto si puedo usar WCF para este propósito, o debería ir con buenos zócalos viejos. Aunque la red inicial sería pequeña, quiero que se escale (miles de clientes). Cualquier sugerencia sería muy apreciada.

+0

¿Cómo desea identificar un cliente 'conocido'? Puede hacerlo por una dirección IP con conectores brutos, pero eso está sujeto a cambios. Si necesita ser seguro, puede usar certificados, SSL con WCF. –

Respuesta

2

Hoy nunca bajaría a un nivel tan bajo como enchufes a menos que realmente tengas que hacerlo. Trabajar con abstracciones de alto nivel es mucho más productivo y creativo. Mejor pasar 2-3 días aprendiendo WCF o .Net Remoting luego 2 semanas de depuración de cosas de bajo nivel.

Tuvimos una decisión similar a la de hace unas semanas. Decidimos usar Remoting, ya que puedes trabajar en el nivel de objeto, es muy fácil de configurar y bastante eficiente. Podríamos haber usado WCF, pero no fue tan simple de configurar.

La gran ventaja de Remoting o WCF es que puede pasar objetos entre el servidor y el cliente y llamar a métodos en cada lado.

Supongamos que usted ha escrito una abstracción para su cámara como:

class Camera 
{ 
    public CompressedImage GetFrame() 
    { 
     .... 
     return image; 
    } 
}  

continuación, puede crear un objeto remoto en el servidor y escribir algo como:

var cam = SomeClientObject.GetCamera(); //get proxy object for the cam 
.... 
var frame = cam.GetFrame(); 

que llamar al método GetFrame() en el cliente y le pasa la imagen a través de (inter) net, si la imagen es serializable. Lo único que debe tener en cuenta es qué objetos crean un proxy en el otro lado y qué objetos se copian en el otro lado.

Eso es realmente poderoso y funciona para nosotros como un encanto. Así que libere su mente de los sockets :)

+0

También estoy de acuerdo en que WCF sería la mejor opción. Aunque debe tener en cuenta los tiempos de espera de por vida de la sesión y similares; no es completamente sencillo. –

+0

¡Muchas gracias por la sugerencia! Definitivamente consideraré la comunicación remota como una opción. – Andy

+0

¿viene wcf con algún tipo de rendimiento? –

1

Estoy de acuerdo Los enchufes son de muy bajo nivel, pero desde la descripción de su problema, parece que desea que el servidor inicie la comunicación con los clientes además del cliente habitual -> comunicación del servidor (es decir, iniciado por el cliente). También soy nuevo en WCF y sé que WCF admite la comunicación dúplex. Pero mi GUESS es que cuando un cliente realiza una solicitud también pasa una función de devolución de llamada a la que el servidor puede recurrir. Entonces, el modelo sigue siendo cliente -> servidor seguido de un servidor que llama a la devolución de llamada.

La comunicación iniciada por el servidor con WCF es algo que no soy aware de. Así que es posible que desee comprobar esto antes de decidir sobre cualquiera de los dos.
También podría considerar una combinación de ambos, como en, WCF para la mayoría de los escenarios y una gestión de subprocesos separada para la comunicación de socket para aquellos casos en que WCF no es adecuado/posible.

Gracias
VM

+0

¡Gracias por la respuesta! La comunicación inicial definitivamente debe ser iniciada por el cliente debido a problemas de NAT. Pero una vez hecho esto, el servidor debe hacerse cargo y controlar al cliente. Yo también soy nuevo en WCF, así que gracias por el consejo sobre la comunicación iniciada por el servidor. Creo que pasaré algún tiempo con WCF para entender sus ventajas y limitaciones. – Andy

+0

Háganme saber sus hallazgos. Me ayudaría a mí también :) – Vikas

0

Puede usar WCF. Le permite hacer devoluciones de llamada al cliente. comience aquí: http://idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx

Y también estoy de acuerdo con otra respuesta: es mucho más productivo pasar unos días en la evaluación WCF en lugar de ir a sockets. En el futuro, necesitará obtener muchas funciones ausentes en el socket ... por lo que deberá implementarlas usted mismo. Mientras que WCF los proporciona fuera de la caja.

+0

Gracias por la sugerencia. Pasaré un par de días evaluando WCF/Remoting :) – Andy

2

He estado haciendo exactamente lo mismo. Escribí un servidor basado en TCP que puede manejar 1,000 conexiones simultáneas de clientes con facilidad en aproximadamente una hora y culmina en 80 líneas de código. Pasé varios días intentando y fracasando en obtener un servidor WCF dúplex para hacer lo mismo. Se necesitaron 175 líneas de código para que un servidor WCF dúplex y el cliente funcionaran y se bloquea si 30 clientes intentan conectarse simultáneamente.

Así que no estoy de acuerdo con las otras respuestas aquí: He encontrado que WCF es un desastre absoluto y las tomas de corriente crudas son mucho más fáciles y confiables.