Compartir a través de


Ejemplo WCF Chat

Actualización: noviembre 2007

El ejemplo Chat muestra cómo implementar una aplicación de chat con la participación de varios grupos mediante PeerChannel. El resto de las instancias reciben los mensajes enviados por cualquier instancia de una aplicación de chat.

Para obtener ejemplos e instrucciones para la instalación

  • Siga uno o varios de los procedimientos siguientes:

    • En el menú Ayuda, haga clic en Ejemplos.

      El archivo Léame muestra información sobre los ejemplos.

    • Visite el sitio web Visual Studio 2008 Samples. Están disponibles las versiones de ejemplos más recientes.

    • Busque los ejemplos en el equipo en el que está instalado Visual Studio. De manera predeterminada, los ejemplos y el archivo Léame se instalan en unidad:\Archivos de programa\Microsoft Visual Studio 9.0\Samples\lcid. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Para obtener más información, vea Localizar archivos de ejemplo.

.

Nota de seguridad:

En este ejemplo de código se ilustra un concepto y únicamente se muestra el código correspondiente a dicho concepto. Es posible que no cumpla los requisitos de seguridad de un entorno concreto y, por tanto, no debería utilizarse tal y como se muestra. Se recomienda agregar código de seguridad y de control de errores para que los proyectos sean más seguros y sólidos. Microsoft proporciona este ejemplo "tal cual" sin ninguna garantía.

Para ejecutar el ejemplo

  1. En el Explorador de soluciones, abra el archivo .sln.

    Siempre que un paso haga referencia a un cliente o un servicio, esos pasos se aplican a instancias independientes del ejemplo (dado que el ejemplo Chat no es ninguna aplicación cliente ni de servicio).

  2. Presione F5 para ejecutar la aplicación Chat.

  3. Inicie todas las instancias (instancia con nombre y ubicada en ruta de instalación de Visual Basic\Projects\Chat\Instance\Bin\Debug\Instance.exe) que desee. Empiece por escribir un sobrenombre que distinguirá los mensajes enviados desde una instancia de cliente concreta. Poco después de que se escriba este nombre, se pueden enviar los mensajes de Chat a la red. Estos mensajes se deben enviar al resto de las instancias que tienen un nombre de miembro distinto. (Es decir, no se mostrará ningún mensaje de un cliente que tenga el mismo nombre y el propio mensaje de un cliente único no se enviará a la ventana de la consola de ese cliente.)

Demostraciones

El ejemplo Chat no es ninguna aplicación cliente ni de servicio. Es una aplicación real punto a punto, en la que cada instancia actúa como par de otras instancias. Cada instancia puede enviar mensajes a otras instancias y recibirlos de éstas mediante el contrato dúplex IChat.

Conceptos básicos

PeerChannel es una tecnología de comunicaciones con la participación de varios grupos, punto a punto (P2P) de Windows Communication Foundation (WCF). Ayuda a habilitar una mensajería segura, escalable y de confianza. Un ejemplo común de una aplicación con la participación de varios grupos que puede aprovechar PeerChannel es una aplicación de colaboración como un chat. En un chat, un grupo de personas se comunican entre sí de punto a punto sin servidores. PeerChannel habilita la colaboración P2P, la distribución del contenido, el equilibrio de la carga y el procesamiento distribuido de los escenarios de consumidor y empresa.

PeerChannel presenta los siguientes conceptos nuevos:

  • Una red es una colección con nombre (un gráfico interconectado) de nodos del mismo nivel que pueden comunicarse entre sí y que identifica un identificador de red único.

    Nota:

    Los nodos activos de la red publican sus nombres de red para que otros puedan buscarlos. Una red se adapta al cambio de pertenencia, tiene conectividad adaptable en un entorno en el que los nodos entran y salen de la red constantemente y se optimiza dinámicamente para adaptarse a los modelos de tráfico.

  • Los nodos activos de la red publican sus nombres de red para que otros puedan buscarlos. Una red se adapta al cambio de pertenencia, tiene conectividad adaptable en un entorno en el que los nodos entran y salen de la red constantemente y se optimiza dinámicamente basándose en los modelos de tráfico.

  • Un nodo del mismo nivel es un punto final de una red. Una sola aplicación puede tener varios nodos del mismo nivel que participan en redes diferentes.

  • Una resolución del mismo nivel es responsable de resolver un identificador de red en las direcciones de los puntos finales de los nodos de la red. Un nodo del mismo nivel usa estas direcciones para conectarse con otros nodos de la red. De esta forma, se pueden propagar los mensajes por la red.

Chat es una aplicación de formularios Windows Forms. Cada instancia de una aplicación Chat crea un IDuplexChannel con la misma dirección de punto final. Puesto que todas las instancias de una aplicación Chat utilizan la misma dirección, un mensaje enviado por una instancia de la aplicación lo reciben todas las demás instancias en su canal del mismo nivel.

La aplicación Chat define e implementa el contrato dúplex IChat. Este contrato permite sólo operaciones unidireccionales porque ServiceModel no admite el paradigma una sola solicitud-varias respuestas. (En un canal de varios grupos, una sola solicitud que se envía a la red puede generar varias respuestas.)

Este ejemplo implementa una función Main estática para crear IClientChannel con el contrato dúplex IChat. La función utiliza el punto final que se especifica en el archivo de configuración.

Todas las instancias de chat deben utilizar la misma dirección de punto final para asegurarse de que los mensajes enviados por una instancia los reciben todas las demás instancias.

Las instancias de chat de este ejemplo se buscan entre sí utilizando una resolución personalizada o la resolución del mismo nivel predeterminada (PNRP). Observe que PNRP no está disponible en Windows Server 2003. Por consiguiente, una resolución personalizada se debe utilizar para ejecutar este ejemplo en un sistema que esté ejecutando Windows Server 2003. De forma predeterminada, este ejemplo está configurado para utilizar una resolución personalizada. El uso de una resolución personalizada o de la resolución predeterminada lo determina el punto final del chat definido en el archivo de configuración siguiente. Para intercambiar a la resolución del mismo nivel predeterminada (PNRP), reemplace BindingCustomResolver por BindingDefault en bindingConfiguration en el archivo de configuración del ejemplo.

<!-- Chat instance participating in the mesh. -->
         <endpoint name="ChatEndpoint"
                   address="net.p2p://chatMesh/ServiceModelSamples/Chat" 
                   binding="netPeerTcpBinding" 
                   bindingConfiguration="BindingCustomResolver" 
                   contract="Microsoft.ServiceModel.Samples.IChat">
         </endpoint>

Para permitir que el nodo del mismo nivel se comunique con el servicio Canal de resolución del mismo nivel personalizado del canal del mismo nivel, la configuración del cliente del Canal de resolución del mismo nivel personalizado del canal del mismo nivel se define en el archivo de configuración.

<!-- Client used to communicate with the custom resolver service. -->
<client>
<endpoint configurationName="CustomPeerResolverEndpoint"
address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
    binding="netTcpBinding"
    bindingConfiguration="Binding3"
    contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
</endpoint>
</client>

La dirección identifica la dirección del servicio de resolución. Si el servicio de resolución se está ejecutando en un equipo remoto, reemplace localhost por un nombre de dominio completo.

El ejemplo también muestra cómo recuperar el nodo del mismo nivel desde IClientChannel y cómo registrarse para los eventos con y sin conexión utilizando IOnlineStatus. Se inicia un evento en línea cuando el nodo del mismo nivel está conectado al menos a otro nodo del mismo nivel de la red. Se inicia un evento sin conexión cuando el nodo del mismo nivel ya no está conectado a ningún otro nodo del mismo nivel de la red.

Actualmente, no se pueden generar metadatos porque un canal del mismo nivel no se integra con la utilidad de metadatos del servicio (Svcutil.exe).

Al ejecutar el ejemplo, los mensajes de chat enviados por una instancia del Chat se muestran en las ventanas de la consola de otras instancias del Chat. Presione la tecla Q seguida de Entrar en cada ventana de la consola para cerrar la instancia.

Nota:

El ejemplo no controla actualmente todas las posibles excepciones que puede producir la infraestructura. Si usa estos ejemplos en un entorno comercial o de producción, siga los procedimientos recomendados del control de excepciones adecuado.

Vea también

Tareas

Tutorial: Crear y obtener acceso a los servicios WCF

Ejemplo Consuming ASMX and WCF Services