MatriX Desarrollador Tutorial

62
MatriX desarrollador tutorial Sobre MatriX Descargar En este documento se El registro de La conexión del cliente Abierto Cerca Transporte SRV-Records BOSH Seguridad Silverlight Autenticación Single Sign On Certificados Inicio de sesión anónimo Seleccione Sasl mecanismo Facebook autenticación Lista Eventos Administración Adición de contactos Añadir y suscribirse Actualizar los contactos Eliminar contactos Suscripción Suscribir Tramitar las solicitudes Filtros IqFilter Asíncrono filtro Iq Sincrónica Iq filtro XPathFilter Registro Registrar una nueva cuenta MatriX se extiende Diseño de protocolos de Clase de diseño Silverlight Glosario BOSH C2S Jid Desnudo Jid Completo Jid Lista S2S XEP XSF Sobre MatriX Matrix es una biblioteca para el Extensible Messaging and Presence Protocol (XMPP) para la plataforma Microsoft. NET. Matriz se puede utilizar para crear de alta calidad y productos de alto rendimiento XMPP Software. Como XMPP MatriX está diseñado para extensibilidad fácil. Matrix es el sucesor de nuestra biblioteca agsXMPP éxito. Fue reescrito desde cero para incluir a todas las nuevas características de la última. Plataformas NET. Requisitos para la matriz son. NET 3.5 y versiones posteriores. Descargar Si usted no ha descargado el SDK MatriX XMPP todavía se puede encontrar más información y descargar el aquí En este documento se Este documento es tutorial para el desarrollo de XMPP. Usted ya debe estar familiarizado con el protocolo XMPP básicos antes de empezar a trabajar con la matriz y este documento. Si usted no está familiarizado con los conceptos básicos XMPP entonces le sugerimos que lea un libro sobre XMPP primero o XMPP: The Definitive Guide es un muy buen libro para empezar. El registro de Cuando usted tiene un problema específico, en muchos casos se solicita un registro XML de usted. Este registro XML es XML entrantes y salientes de la sesión de XMPP. A obtener esta información de los controladores de OnReceiveXml y OnSendXml en todas las clases XmppStream. view source print?

Transcript of MatriX Desarrollador Tutorial

Page 1: MatriX Desarrollador Tutorial

MatriX desarrollador tutorial

Sobre MatriX Descargar En este documento se El registro de La conexioacuten

del cliente Abierto Cerca Transporte SRV-Records BOSH Seguridad Silverlight Autenticacioacuten Single Sign On Certificados Inicio de sesioacuten anoacutenimo Seleccione

Sasl mecanismo Facebook autenticacioacuten Lista Eventos Administracioacuten Adicioacuten

de contactos Antildeadir y suscribirse Actualizar los contactos Eliminar contactos Suscripcioacuten Suscribir Tramitar las solicitudes Filtros IqFilter Asiacutencrono filtro Iq

Sincroacutenica Iq filtro XPathFilter Registro Registrar una nueva cuenta MatriX se extiende Disentildeo de protocolos de Clase de disentildeo Silverlight Glosario BOSH

C2S Jid Desnudo Jid Completo Jid Lista S2S XEP XSF

Sobre MatriX

Matrix es una biblioteca para el Extensible Messaging and Presence Protocol (XMPP)

para la plataforma Microsoft NET Matriz se puede utilizar para crear de alta calidad y

productos de alto rendimiento XMPP Software Como XMPP MatriX estaacute disentildeado para

extensibilidad faacutecil

Matrix es el sucesor de nuestra biblioteca agsXMPP eacutexito Fue reescrito desde cero

para incluir a todas las nuevas caracteriacutesticas de la uacuteltima Plataformas NET

Requisitos para la matriz son NET 35 y versiones posteriores

Descargar

Si usted no ha descargado el SDK MatriX XMPP todaviacutea se puede encontrar maacutes

informacioacuten y descargar el aquiacute

En este documento se

Este documento es tutorial para el desarrollo de XMPP

Usted ya debe estar familiarizado con el protocolo XMPP baacutesicos antes de

empezar a trabajar con la matriz y este documento

Si usted no estaacute familiarizado con los conceptos baacutesicos XMPP entonces le

sugerimos que lea un libro sobre XMPP primero

o XMPP The Definitive Guide es un muy buen libro para empezar

El registro de

Cuando usted tiene un problema especiacutefico en muchos casos se solicita un registro

XML de usted Este registro XML es XML entrantes y salientes de la sesioacuten de XMPP A

obtener esta informacioacuten de los controladores de OnReceiveXml y OnSendXml en

todas las clases XmppStream

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnReceiveXml += new

EventHandlerltTextEventArgsgt(XmppClientOnReceiveXml)ltSPANgt

xmppClientOnReceiveXml + = new EventHandler ltTextEventArgsgt

(XmppClientOnReceiveXml)ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnSendXml += new

EventHandlerltTextEventArgsgt(XmppClientOnSendXml)ltSPANgt

xmppClientOnSendXml + = new EventHandler ltTextEventArgsgt

(XmppClientOnSendXml)ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XmppClientOnSendXml(object sender TextEventArgs e)ltSPANgt vaciacuteo

XmppClientOnSendXml (object sender TextEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtAddDebug(eText)ltSPANgt AddDebug (eText)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XmppClientOnReceiveXml(object sender TextEventArgs e)ltSPANgt vaciacuteo

XmppClientOnReceiveXml (object sender TextEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtAddDebug(eText)ltSPANgt AddDebug (eText)ltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

AddDebug(string debug)ltSPANgt vaciacuteo AddDebug (depuracioacuten de

cuerda)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

write the debug data to a file textbox etcltSPANgt Escribir

los datos de depuracioacuten en un archivo texto etc ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La conexioacuten del cliente

Conexiones de los clientes se manejan en la clase XmppClient en la matriz

XMPP es un protocolo basado en dominio como el correo electroacutenico Asiacute que nunca

use direcciones IP de su dominio XMPP (nombre del servidor) iquestO es que escribir

correos electroacutenicos a las direcciones como user166166166166

Abierto

Conectarse a un servidor XMPP es muy simple Todo lo que tienes que hacer es

configurar el nombre de usuario contrasentildea y el servidor XMPP Despueacutes de esa

llamada al meacutetodo Open para establecer la conexioacuten

El meacutetodo Open se asnychronous Esto significa que cuando la llamada de activos

que no esteacute conectado Matrix acaba de comenzar el proceso de conectar con el

servidor XMPP Usted tiene que usar la liacutenea de OnLogin MatriX eventos etc

OnRosterEnd para detectar una conexioacuten exitosa Use los eventos de error para saber

si la conexioacuten ha fallado

Si desea ejecutar una accioacuten correcta despueacutes de la sesioacuten se sugiere iniciar la accioacuten

de la OnRosterEnd OnPresence OnLogin o evento OnBind

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(servercom)ltSPANgt

xmppClientSetXmppDomain (servercom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Cerca

Para cerrar una sesioacuten de XMPP correctamente soacutelo Close () debe ser llamado El

servidor establece su presencia de forma automaacutetica a no disponible (sin conexioacuten) y

notifica a todos los contratos suscritos con la presencia no estaacute disponible

Si usted todaviacutea desea enviar la presencia no estaacute disponible en su cuenta o desea

incluir un mensaje de estado a continuacioacuten llamar SendUnavailablePresence ()

seguido de Close ()

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

CloseSession()ltSPANgt CloseSession private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSendUnavailablePresence(Gone home from the

office)ltSPANgt xmppClientSendUnavailablePresence (ido a casa de la

oficina)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Transporte

Sesiones XMPP son persistentes conexiones de socket TCP por defecto el puerto 5222

El zoacutecalo se conecta en el inicio de las sesiones y la desconecta cuando el periodo de

sesiones (flujo de XMPP) termina

SRV-Records

XMPP es el uso de registros SRV para encontrar el nombre de host y el puerto del

servicio XMPP automaacuteticamente Matriz para NET busca automaacuteticamente los

registros SRV y utiliza los datos para establecer la conexioacuten Registros SRV son

requeridos por el RFC XMPP para los servicios XMPP Si no desea utilizar los registros

SRV se puede especificar el manual del nombre de host y el puerto y deshabilitar las

buacutesquedas SRV Esto es a menudo necesaria durante el desarrollo del Develoment

cuando no se estaacuten poniendo a prueba en contra de servidores de juego

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 2: MatriX Desarrollador Tutorial

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnReceiveXml += new

EventHandlerltTextEventArgsgt(XmppClientOnReceiveXml)ltSPANgt

xmppClientOnReceiveXml + = new EventHandler ltTextEventArgsgt

(XmppClientOnReceiveXml)ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnSendXml += new

EventHandlerltTextEventArgsgt(XmppClientOnSendXml)ltSPANgt

xmppClientOnSendXml + = new EventHandler ltTextEventArgsgt

(XmppClientOnSendXml)ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XmppClientOnSendXml(object sender TextEventArgs e)ltSPANgt vaciacuteo

XmppClientOnSendXml (object sender TextEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtAddDebug(eText)ltSPANgt AddDebug (eText)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XmppClientOnReceiveXml(object sender TextEventArgs e)ltSPANgt vaciacuteo

XmppClientOnReceiveXml (object sender TextEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtAddDebug(eText)ltSPANgt AddDebug (eText)ltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

AddDebug(string debug)ltSPANgt vaciacuteo AddDebug (depuracioacuten de

cuerda)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

write the debug data to a file textbox etcltSPANgt Escribir

los datos de depuracioacuten en un archivo texto etc ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La conexioacuten del cliente

Conexiones de los clientes se manejan en la clase XmppClient en la matriz

XMPP es un protocolo basado en dominio como el correo electroacutenico Asiacute que nunca

use direcciones IP de su dominio XMPP (nombre del servidor) iquestO es que escribir

correos electroacutenicos a las direcciones como user166166166166

Abierto

Conectarse a un servidor XMPP es muy simple Todo lo que tienes que hacer es

configurar el nombre de usuario contrasentildea y el servidor XMPP Despueacutes de esa

llamada al meacutetodo Open para establecer la conexioacuten

El meacutetodo Open se asnychronous Esto significa que cuando la llamada de activos

que no esteacute conectado Matrix acaba de comenzar el proceso de conectar con el

servidor XMPP Usted tiene que usar la liacutenea de OnLogin MatriX eventos etc

OnRosterEnd para detectar una conexioacuten exitosa Use los eventos de error para saber

si la conexioacuten ha fallado

Si desea ejecutar una accioacuten correcta despueacutes de la sesioacuten se sugiere iniciar la accioacuten

de la OnRosterEnd OnPresence OnLogin o evento OnBind

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(servercom)ltSPANgt

xmppClientSetXmppDomain (servercom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Cerca

Para cerrar una sesioacuten de XMPP correctamente soacutelo Close () debe ser llamado El

servidor establece su presencia de forma automaacutetica a no disponible (sin conexioacuten) y

notifica a todos los contratos suscritos con la presencia no estaacute disponible

Si usted todaviacutea desea enviar la presencia no estaacute disponible en su cuenta o desea

incluir un mensaje de estado a continuacioacuten llamar SendUnavailablePresence ()

seguido de Close ()

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

CloseSession()ltSPANgt CloseSession private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSendUnavailablePresence(Gone home from the

office)ltSPANgt xmppClientSendUnavailablePresence (ido a casa de la

oficina)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Transporte

Sesiones XMPP son persistentes conexiones de socket TCP por defecto el puerto 5222

El zoacutecalo se conecta en el inicio de las sesiones y la desconecta cuando el periodo de

sesiones (flujo de XMPP) termina

SRV-Records

XMPP es el uso de registros SRV para encontrar el nombre de host y el puerto del

servicio XMPP automaacuteticamente Matriz para NET busca automaacuteticamente los

registros SRV y utiliza los datos para establecer la conexioacuten Registros SRV son

requeridos por el RFC XMPP para los servicios XMPP Si no desea utilizar los registros

SRV se puede especificar el manual del nombre de host y el puerto y deshabilitar las

buacutesquedas SRV Esto es a menudo necesaria durante el desarrollo del Develoment

cuando no se estaacuten poniendo a prueba en contra de servidores de juego

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 3: MatriX Desarrollador Tutorial

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtAddDebug(eText)ltSPANgt AddDebug (eText)ltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

AddDebug(string debug)ltSPANgt vaciacuteo AddDebug (depuracioacuten de

cuerda)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

write the debug data to a file textbox etcltSPANgt Escribir

los datos de depuracioacuten en un archivo texto etc ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La conexioacuten del cliente

Conexiones de los clientes se manejan en la clase XmppClient en la matriz

XMPP es un protocolo basado en dominio como el correo electroacutenico Asiacute que nunca

use direcciones IP de su dominio XMPP (nombre del servidor) iquestO es que escribir

correos electroacutenicos a las direcciones como user166166166166

Abierto

Conectarse a un servidor XMPP es muy simple Todo lo que tienes que hacer es

configurar el nombre de usuario contrasentildea y el servidor XMPP Despueacutes de esa

llamada al meacutetodo Open para establecer la conexioacuten

El meacutetodo Open se asnychronous Esto significa que cuando la llamada de activos

que no esteacute conectado Matrix acaba de comenzar el proceso de conectar con el

servidor XMPP Usted tiene que usar la liacutenea de OnLogin MatriX eventos etc

OnRosterEnd para detectar una conexioacuten exitosa Use los eventos de error para saber

si la conexioacuten ha fallado

Si desea ejecutar una accioacuten correcta despueacutes de la sesioacuten se sugiere iniciar la accioacuten

de la OnRosterEnd OnPresence OnLogin o evento OnBind

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(servercom)ltSPANgt

xmppClientSetXmppDomain (servercom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Cerca

Para cerrar una sesioacuten de XMPP correctamente soacutelo Close () debe ser llamado El

servidor establece su presencia de forma automaacutetica a no disponible (sin conexioacuten) y

notifica a todos los contratos suscritos con la presencia no estaacute disponible

Si usted todaviacutea desea enviar la presencia no estaacute disponible en su cuenta o desea

incluir un mensaje de estado a continuacioacuten llamar SendUnavailablePresence ()

seguido de Close ()

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

CloseSession()ltSPANgt CloseSession private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSendUnavailablePresence(Gone home from the

office)ltSPANgt xmppClientSendUnavailablePresence (ido a casa de la

oficina)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Transporte

Sesiones XMPP son persistentes conexiones de socket TCP por defecto el puerto 5222

El zoacutecalo se conecta en el inicio de las sesiones y la desconecta cuando el periodo de

sesiones (flujo de XMPP) termina

SRV-Records

XMPP es el uso de registros SRV para encontrar el nombre de host y el puerto del

servicio XMPP automaacuteticamente Matriz para NET busca automaacuteticamente los

registros SRV y utiliza los datos para establecer la conexioacuten Registros SRV son

requeridos por el RFC XMPP para los servicios XMPP Si no desea utilizar los registros

SRV se puede especificar el manual del nombre de host y el puerto y deshabilitar las

buacutesquedas SRV Esto es a menudo necesaria durante el desarrollo del Develoment

cuando no se estaacuten poniendo a prueba en contra de servidores de juego

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 4: MatriX Desarrollador Tutorial

Abierto

Conectarse a un servidor XMPP es muy simple Todo lo que tienes que hacer es

configurar el nombre de usuario contrasentildea y el servidor XMPP Despueacutes de esa

llamada al meacutetodo Open para establecer la conexioacuten

El meacutetodo Open se asnychronous Esto significa que cuando la llamada de activos

que no esteacute conectado Matrix acaba de comenzar el proceso de conectar con el

servidor XMPP Usted tiene que usar la liacutenea de OnLogin MatriX eventos etc

OnRosterEnd para detectar una conexioacuten exitosa Use los eventos de error para saber

si la conexioacuten ha fallado

Si desea ejecutar una accioacuten correcta despueacutes de la sesioacuten se sugiere iniciar la accioacuten

de la OnRosterEnd OnPresence OnLogin o evento OnBind

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(servercom)ltSPANgt

xmppClientSetXmppDomain (servercom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Cerca

Para cerrar una sesioacuten de XMPP correctamente soacutelo Close () debe ser llamado El

servidor establece su presencia de forma automaacutetica a no disponible (sin conexioacuten) y

notifica a todos los contratos suscritos con la presencia no estaacute disponible

Si usted todaviacutea desea enviar la presencia no estaacute disponible en su cuenta o desea

incluir un mensaje de estado a continuacioacuten llamar SendUnavailablePresence ()

seguido de Close ()

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

CloseSession()ltSPANgt CloseSession private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSendUnavailablePresence(Gone home from the

office)ltSPANgt xmppClientSendUnavailablePresence (ido a casa de la

oficina)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Transporte

Sesiones XMPP son persistentes conexiones de socket TCP por defecto el puerto 5222

El zoacutecalo se conecta en el inicio de las sesiones y la desconecta cuando el periodo de

sesiones (flujo de XMPP) termina

SRV-Records

XMPP es el uso de registros SRV para encontrar el nombre de host y el puerto del

servicio XMPP automaacuteticamente Matriz para NET busca automaacuteticamente los

registros SRV y utiliza los datos para establecer la conexioacuten Registros SRV son

requeridos por el RFC XMPP para los servicios XMPP Si no desea utilizar los registros

SRV se puede especificar el manual del nombre de host y el puerto y deshabilitar las

buacutesquedas SRV Esto es a menudo necesaria durante el desarrollo del Develoment

cuando no se estaacuten poniendo a prueba en contra de servidores de juego

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 5: MatriX Desarrollador Tutorial

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Cerca

Para cerrar una sesioacuten de XMPP correctamente soacutelo Close () debe ser llamado El

servidor establece su presencia de forma automaacutetica a no disponible (sin conexioacuten) y

notifica a todos los contratos suscritos con la presencia no estaacute disponible

Si usted todaviacutea desea enviar la presencia no estaacute disponible en su cuenta o desea

incluir un mensaje de estado a continuacioacuten llamar SendUnavailablePresence ()

seguido de Close ()

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

CloseSession()ltSPANgt CloseSession private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSendUnavailablePresence(Gone home from the

office)ltSPANgt xmppClientSendUnavailablePresence (ido a casa de la

oficina)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Transporte

Sesiones XMPP son persistentes conexiones de socket TCP por defecto el puerto 5222

El zoacutecalo se conecta en el inicio de las sesiones y la desconecta cuando el periodo de

sesiones (flujo de XMPP) termina

SRV-Records

XMPP es el uso de registros SRV para encontrar el nombre de host y el puerto del

servicio XMPP automaacuteticamente Matriz para NET busca automaacuteticamente los

registros SRV y utiliza los datos para establecer la conexioacuten Registros SRV son

requeridos por el RFC XMPP para los servicios XMPP Si no desea utilizar los registros

SRV se puede especificar el manual del nombre de host y el puerto y deshabilitar las

buacutesquedas SRV Esto es a menudo necesaria durante el desarrollo del Develoment

cuando no se estaacuten poniendo a prueba en contra de servidores de juego

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 6: MatriX Desarrollador Tutorial

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSendUnavailablePresence(Gone home from the

office)ltSPANgt xmppClientSendUnavailablePresence (ido a casa de la

oficina)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Transporte

Sesiones XMPP son persistentes conexiones de socket TCP por defecto el puerto 5222

El zoacutecalo se conecta en el inicio de las sesiones y la desconecta cuando el periodo de

sesiones (flujo de XMPP) termina

SRV-Records

XMPP es el uso de registros SRV para encontrar el nombre de host y el puerto del

servicio XMPP automaacuteticamente Matriz para NET busca automaacuteticamente los

registros SRV y utiliza los datos para establecer la conexioacuten Registros SRV son

requeridos por el RFC XMPP para los servicios XMPP Si no desea utilizar los registros

SRV se puede especificar el manual del nombre de host y el puerto y deshabilitar las

buacutesquedas SRV Esto es a menudo necesaria durante el desarrollo del Develoment

cuando no se estaacuten poniendo a prueba en contra de servidores de juego

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 7: MatriX Desarrollador Tutorial

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(gmailcom)ltSPANgt

xmppClientSetXmppDomain (gmailcom)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable SRV lookups and specify hostname manualltSPANgt Desactivar

las buacutesquedas SRV y especificar el nombre de host manual deltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientResolveSrvRecords = falseltSPANgt

xmppClientResolveSrvRecords = falseltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientHostname = talkgooglecomltSPANgt

xmppClientHostname = talkgooglecomltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 8: MatriX Desarrollador Tutorial

= MatrixXmppShowchatltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MartriX moacutevil y la matriz de Silverlight no son compatibles con las buacutesquedas SRV

porque esta API no estaacuten presentes en el subyacente Ediciones NET Framework

BOSH

Bidireccional las corrientes maacutes sincroacutenico HTTP (BOSH) es una extensioacuten para el

transporte de flujos de XMPP a traveacutes del protocolo HTTP BOSH fue desarrollado para

los clientes como los navegadores web limitado que no puede abrir sockets cualquier

comunicarse soacutelo a traveacutes del protocolo XMPP

Incluso Silverlight es capaz de crear sockets que tiene sentido en muchos casos para

elegir el transporte BOSH para las aplicaciones de Silverlight

Servidor de una configuracioacuten maacutes sencilla

Puertos no estaacutendar a menudo son bloqueados en los cortafuegos mientras

que las peticiones HTTP que no se bloquean

Usted puede asegurar la conexioacuten cuando el servicio de BOSH soporta

HTTPS Silverlight no tiene SslStream por lo tanto tomas de corriente no se

puede asegurar mediante el protocolo TLS

Muchas empresas utilizan servidores proxy HTTP de la empresa como la uacutenica

conexioacuten a Internet En este escenario la uacutenica manera de establecer una conexioacuten

XMPP BOSH seraacute asiacute

El siguiente ejemplo muestra coacutemo usted elige BOSH como la capa de transporte y la

configuracioacuten de un flujo de clientes XMPP

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 9: MatriX Desarrollador Tutorial

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(username)ltSPANgt

xmppClientSetUsername (username)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(ag-softwarede)ltSPANgt

xmppClientSetXmppDomain (ag-softwarede)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = secretltSPANgt xmppClientPassword =

secretoltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientTransport = MatrixNetTransportBOSHltSPANgt

xmppClientTransport = MatrixNetTransportBOSHltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUri = new SystemUri(httpag-

softwarede5280http-bind)ltSPANgt xmppClientUri = new SystemUri

(httpag-softwarede5280http-bind)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 10: MatriX Desarrollador Tutorial

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Seguridad

Porque BOSH estaacute utilizando HTTP como capa de transporte conexiones BOSH se

puede cifrar mediante HTTPS Todo lo que tienes que hacer es utilizar un URI https

en lugar de un URI HTTP cuando sea compatible con su servidor XMPP

Cuando se utiliza HTTPS entonces NET Framework valida el certificado SSL de forma

automaacutetica Muchos servidores utilizan auto firmado los certificados SSL en la

configuracioacuten por defecto En este caso la conexioacuten fallaraacute cuando el certificado o la

CA no se instala y de confianza en el almaceacuten de certificados de Windows Debido a

que el NET Framework no nos permite enviar a los servidores WebRequests inseguro y

las anula

Para las pruebas con el auto certificados firmados tambieacuten puede aceptar todos los

certificados con el siguiente coacutedigo

Nunca utilice este coacutedigo en produccioacuten ya que desactiva toda la seguridad para la

validacioacuten de certificados

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 11: MatriX Desarrollador Tutorial

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

ServicePointManagerServerCertificateValidationCallback =

ValidateServerCertficateltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static bool ValidateServerCertficate(ltSPANgt privado

ValidateServerCertficate bool estaacutetica (ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtobject

senderltSPANgt objeto emisorltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Certificate certltSPANgt X509Certificate certltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtX509Chain chainltSPANgt X509Chain cadenaltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtSslPolicyErrors sslPolicyErrors)ltSPANgt SslPolicyErrors

sslPolicyErrors)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtreturn

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 12: MatriX Desarrollador Tutorial

trueltSPANgt return trueltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Silverlight

Tambieacuten la versioacuten de Silverlight en la matriz se basa en WebRequests Por lo tanto

deben ser conscientes de las restricciones de acceso de seguridad de Silverlight

Puedes leer maacutes sobre esto en la seccioacuten de Silverlight

Silverlight tiene dos pilas de HTTP

Navegador HTTP pila

Pila de cliente HTTP

MatriX estaacute trabajando bien con los dos de estas pilas Ambos tienen sus ventajas y

desventajas Usted puede encontrar maacutes informacioacuten sobre estos dos pilas de aquiacute en

el MSDN

Si desea seleccionar una pila HTTP en el cliente que usted puede hacer esto con el

siguiente coacutedigo

Seleccione la pila de cliente HTTP

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorClientHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorClientHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorClientHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorClientHttp)ltSPANgt

Seleccione la pila HTTP Browser

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 13: MatriX Desarrollador Tutorial

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpResult =

WebRequestRegisterPrefix(http

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpResult

WebRequestRegisterPrefix (http

WebRequestCreatorBrowserHttp)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtbool httpsResult =

WebRequestRegisterPrefix(https

WebRequestCreatorBrowserHttp)ltSPANgt bool = httpsResult

WebRequestRegisterPrefix (https

WebRequestCreatorBrowserHttp)ltSPANgt

Autenticacioacuten

Una sesioacuten de XMPP puede ser autenticado con los siguientes mecanismos de matriz

de usuario y contrasentildea

Inicio de sesioacuten uacutenico mediante Kerberos

Certificados

Single Sign On

El uso de Kerberos puede autenticar con credenciales de inicio de sesioacuten de Windows

en la matriz Si usted tiene un servidor de XMPP de trabajo que admite la

autenticacioacuten Kerberos no tiene que dar nombre de usuario y contrasentildea Soacutelo tienes

que configurar UseSSO de verdad y de acceso Usted puede conseguir su Jid completa

que incluye el nombre de usuario en el caso de OnBind cuando sea necesario

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 14: MatriX Desarrollador Tutorial

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientUseSso = trueltSPANgt xmppClientUseSso =

trueltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 15: MatriX Desarrollador Tutorial

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Certificados

Cuando usted se inscribe en el uso de certificados que tiene que proporcionar un

objeto X509Certificate2 con el objeto XmppClient Al presentar un certificado sin

contrasentildea ad nombre de usuario es necesario Cuando se establece un nombre de

usuario entonces este nombre de usuario se acostumbre a la Identificacioacuten authz

durante la autenticacioacuten SASL EXTERNAL

Cuando no se proporciona nombre de usuario y la autenticacioacuten se ha realizado

correctamente usted puede conseguir su Jid completa que incluye el nombre de

usuario del evento OnBind

El siguiente ejemplo utiliza un archivo de certificado de inicio de sesioacuten Ninguacuten

nombre de usuario se proporciona

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 16: MatriX Desarrollador Tutorial

textgtprivate void Connect()ltSPANgt private void Connect ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnBind += new

SystemEventHandlerltJidEventArgsgt(xmppClient_OnBind)ltSPANgt

xmppClientOnBind + = new SystemEventHandler ltJidEventArgsgt

(xmppClient_OnBind)ltSPANgt

04

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientStatus = Im chattyltSPANgt xmppClientStatus =

Soy habladoraltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientShow = MatrixXmppShowchatltSPANgt xmppClientShow

= MatrixXmppShowchatltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClientCertificate = new

X509Certificate2(Ccertsxmppalexag-softwaredep12

secret)ltSPANgt xmppClientClientCertificate = new X509Certificate2

( C certs XMPP alexag-softwaredep12 secreto)ltSPANgt

09

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 17: MatriX Desarrollador Tutorial

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBind(object sender JidEventArgs

e)ltSPANgt xmppClient_OnBind private void (object sender JidEventArgs

e)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt get

our own Jid in the bind eventltSPANgt Obtener nuestra Jid propia

en caso de unirseltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(eJid)ltSPANgt DebugWriteLine (eJid)ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Inicio de sesioacuten anoacutenimo

MatriX maneja conexiones anoacutenimas de forma automaacutetica cuando sea compatible con

el servidor Usted puede obtener su servidor asignado Jid en el caso de OnBind

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 18: MatriX Desarrollador Tutorial

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtxmppClientServer =

myservercomltSPANgt xmppClientServer =

myservercomltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientAnonymousLogin = trueltSPANgt

xmppClientAnonymousLogin = trueltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

4

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBind(object sender JidEventArgs e)ltSPANgt

xmppClient_OnBind private void (object sender JidEventArgs e)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

7 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

myJid = eJidltSPANgt var = myJid eJidltSPANgt

8 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Seleccione Sasl mecanismo

MatriX selecciona el mecanismo SASL maacutes seguro y adecuado por defecto Pero a

veces desea especificar el manual del mecanismo SASL y desactivar la seleccioacuten

automaacutetica de la biblioteca

Tendraacute que suscribirse a la Configuracioacuten automaacutetica del controlador al evento

OnBeforeSasl falsas y especificar el SaslMechanism en el SaslEventArgs

En el siguiente ejemplo se selecciona el mecanismo SASL PLAIN para la autenticacioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 19: MatriX Desarrollador Tutorial

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

xmppClient_OnBeforeSasl(object sender SaslEventArgs e)ltSPANgt private

void xmppClient_OnBeforeSasl (object sender SaslEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

disable automatic selectionltSPANgt Desactivar la seleccioacuten

automaacuteticaltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

eSaslMechanism = MatrixXmppSaslSaslMechanismPLAINltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Facebook autenticacioacuten

Facebook en la actualidad dispone de dos mecanismos SASL para la autenticacioacuten

DIGEST-MD5

X-Facebook-PLATAFORMA

Por matriz por defecto se elige DIGEST-MD5 porque este es un mechaism Sasl

conocido y seguro

X-Facebook-plataforma se puede utilizar para proporcionar una mejor experiencia de

usuario y una mayor seguridad para la plataforma de Facebook Cuando la aplicacioacuten

ya ha sido autenticado con la API de Facebook puede autenticarse en el servidor XMPP

con esta sesioacuten ya existente Esto requiere los siguientes datos

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 20: MatriX Desarrollador Tutorial

Api-Key

Api-Secret

Sesioacuten-Key

El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_KEY =

12345678912345678912345678912345ltSPANgt private const cadena

api_key = 12345678912345678912345678912345ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate const string API_SECRET =

98765432198765432198765432198765ltSPANgt API_SECRET privado const

string = 98765432198765432198765432198765ltSPANgt

03

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnBeforeSasl(object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt private void

xmppClient_OnBeforeSasl (object sender

MatrixXmppSaslSaslEventArgs e)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgteAuto

= falseltSPANgt eAuto = falseltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

eSaslMechanism =

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 21: MatriX Desarrollador Tutorial

MatrixXmppSaslSaslMechanismX_FACEBOOK_PLATFORMltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteSaslProperties = new

MatrixXmppSaslProcessorFacebookFacebookPropertiesltSPANgt

eSaslProperties =

MatrixXmppSaslProcessorFacebookFacebookProperties nuevoltSPANgt

10 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiKey = API_KEYltSPANgt ApiKey =

api_keyltSPANgt

12 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtApiSecret = API_SECRETltSPANgt ApiSecret =

API_SECRETltSPANgt

13 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtSessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt SessionKey =

the_session_key_retrieved_from_your_api_sessionltSPANgt

14 ltSPAN onmouseover=_tipon(this)

onmouseout=_tipoff()gtltSPAN style=TEXT-ALIGN left DIRECTION ltr

class=google-src-textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 22: MatriX Desarrollador Tutorial

Es importante que al solicitar el permiso xmpp_login en la sesioacuten de la aplicacioacuten de

Facebook de lo contrario la autenticacioacuten fallaraacute

Lista

En XMPP la lista de contactos de amigos aka trade lista se denomina lista Cuando

AutoRoster es cierto (por defecto) solicita MatriX la lista de forma automaacutetica en cada

inicio de sesioacuten A esto le llamamos la lista completa Si usted no desea recibir la lista

de cada conjunto AutoRoster acceder a falso La mayoriacutea de los clientes existentes

solicitar la lista en cada inicio de sesioacuten Aquiacute estaacute una pequentildea lista donde la fijacioacuten

de AutoRoster en falso sentido

ahorrar ancho de banda (dispositivos moacuteviles)

menor tiempo de inicio de sesioacuten

guardar en cacheacute de la lista en una base de datos y sincronizar a manual

Eventos

Los siguientes eventos se levantoacute mientras que la lista de contactos que se recibe

OnRosterStart

se produce antes de la primera OnRosterItem es despedido Este evento suele utilizarse para detener las actualizaciones (GUI BeginUpdate) del

control de lista al recibir la lista completa de contacto para actualizaciones maacutes raacutepidas GUI

OnRosterItem

se levantoacute para cada contacto en la lista de contactos cuando el plantel

completo se recibe Este evento se desencadena cuando tambieacuten de un solo contacto es antildeadir eliminar o actualizar

OnRosterEnd se produce cuando todos los contactos recibidos Este es tambieacuten el lugar

donde se llama a EndUpdate cuando se utiliza BeginUpdate antes Cuando AutoRoster es cierto este evento tambieacuten se indica que la sesioacuten XMPP estaacute listo para ejecutar acciones en la loacutegica empresarial

Usted tiene que considerar todos los contactos como fuera de liacutenea hasta que obtenga

una presencia de ellos con otro tipo de espectaacuteculo

OnRosterStart y OnRosterEvent obtener soacutelo disparoacute cuando el plantel completo se

recibe no para actualizaciones de contactos individuales

Administracioacuten

Puede administrar sus contactos (lista) con la clase RosterManager

Adicioacuten de contactos

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 23: MatriX Desarrollador Tutorial

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones)ltSPANgt rmAdd (JID Joe Jones)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo en grupo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones Work)ltSPANgt rmAdd (JID Joe Jones Trabajo)ltSPANgt

Agregue el usuario con el joeservercom Jid bajo el nombre de Joe Jones a la lista y

lo puso en el trabajo 2 grupos y amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 24: MatriX Desarrollador Tutorial

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid Joe

Jones string[] Work Friends)ltSPANgt rmAdd (JID Joe

Jones String [] Trabajo Friends)ltSPANgt

Antildeadir y suscribirse

Cuando se agrega un contacto a continuacioacuten en la mayoriacutea de los casos tambieacuten

queremos para el intercambio de presencia con el contacto A la presencia de cambio

que debe suscribirse a la presencia de los contactos El siguiente ejemplo muestra

coacutemo agregar un contacto y suscribirse a la presencia de contactos al mismo tiempo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

3

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 25: MatriX Desarrollador Tutorial

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmAdd(jid

Jones Friends)ltSPANgt rmAdd (JID Jones Friends)ltSPANgt

6 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Actualizar los contactos

Tenemos el joeservercom usuario sin nombre en ninguacuten grupo en la lista de

contactos Ahora queremos antildeadir el nombre de Joe para el contacto y lo puso en el

grupo de amigos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtrmUpdate(jid

Joe Friends)ltSPANgt rmUpdate (JID Joe Friends)ltSPANgt

Cuando se actualiza un contacto siempre tenemos el paso de la informacioacuten de

contacto completa no soacutelo una diferencia de las propiedades que desea agregar

cambiar o Upate

Eliminar contactos

Eliminar el contacto con la joeservercom Jid

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar rm = new

RosterManager(xmppClient)ltSPANgt var rm = new RosterManager

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 26: MatriX Desarrollador Tutorial

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtrmRemove(jid)ltSPANgt rmRemove (JID)ltSPANgt

Suscripcioacuten

Para proteger la privacidad de la informacioacuten de presencia XMPP se intercambia soacutelo

con las entidades que el usuario ha aprobado Suscripciones aprobado en las sesiones

y se almacenan en el servidor XMPP Usted puede revocar las suscripciones en

cualquier momento Dependiendo de la implementacioacuten del servidor y las poliacuteticas de

seguridad de la suscripcioacuten de servidor tambieacuten puede afectar a la mensajeriacutea Un

servidor puede disminuir o revocar los mensajes de las entidades suscritas para evitar

el spam y proteger su privacidad

Un elemento de lista puede tener las siguientes suscripciones

none No estaacuten interesados en la presencia de contactos y tampoco lo es el

contacto con interesados en el tuyo No hay informacioacuten de presencia se

cambia en absoluto

de El tema estaacute interesada en la informacioacuten de presencia pero no se

preocupan por la informacioacuten de presencia de contactos debe ser alguien

importante )

a Usted estaacute interesado en la informacioacuten de presencia de contactos pero el

contacto no estaacute interesado en el tuyo

ambos usted y poacutengase en contacto con los interesados en la informacioacuten

de presencia de cada uno

El PresenceManager se puede utilizar para manejar la suscripcioacuten y la presencia

Suscribir

Para enviar una solicitud de suscripcioacuten a la joeservercom usuario se utiliza el

siguiente coacutedigo

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 27: MatriX Desarrollador Tutorial

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid =

joeservercomltSPANgt JID JID = joeservercomltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtpmSubscribe(jid)ltSPANgt pmSubscribe (JID)ltSPANgt

Opcional se puede antildeadir una razoacuten para la solicitud de suscripcioacuten y ofrecer a

nuestros nicks en esta solicitud El cliente receptor puede mostrar la razoacuten de la

solicitud en la interfaz graacutefica de usuario y usar el apodo de siempre cuando el

remitente se agrega a la lista

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtvar pm = new

PresenceManager(xmppClient)ltSPANgt var = new PresenceManager pm

(xmppClient)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtJid jid = ltA

href=mailtoalexservercomgtalexservercomltAgt ltSPANgt JID JID =

ltA href=mailtoalexservercomgtalexservercomltAgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtstring reason =

Its Alex from AG-SoftwareltSPANgt razoacuten cadena = Es Alex de la AG-

SoftwareltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtpmSubscribe(jid

reason Alex)ltSPANgt pmSubscribe (JID la razoacuten Alex)ltSPANgt

Tramitar las solicitudes

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 28: MatriX Desarrollador Tutorial

Las solicitudes de entrada de suscripcioacuten puede ser manejado con el

PresenceManger asiacute Podemos utilizar el evento OnPresence de XmppClient o el

evento de la OnSubscribe PresenceManager Utilizamos la uacuteltima en el siguiente

ejemplo porque es maacutes faacutecil

Aceptar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerApproveSubscriptionRequest(ePresenceFrom)ltSPA

Ngt presenceManagerApproveSubscriptionRequest

(ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Negar una solicitud de suscripcioacuten

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

presenceManager_OnSubscribe(object sender PresenceEventArgs e)ltSPANgt

presenceManager_OnSubscribe private void (object sender

PresenceEventArgs e)ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 29: MatriX Desarrollador Tutorial

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtpresenceManagerDenySubscriptionRequest(ePresenceFrom)ltSPANgt

presenceManagerDenySubscriptionRequest (ePresenceFrom)ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

Filtros

Los filtros se pueden utilizar para recibir notificaciones (eventos) de estrofas usted

estaacute interesado en El uso de filtros que el coacutedigo es mucho maacutes faacutecil de leer ya que

deshacerse de un montoacuten de anidados if-then-else

En la actualidad hay tres clases de filtros

IqFilter

MessageFilter

PresenceFilter

XPathFilter

IqFilter

En XMPP tenemos un mecanismo de respuesta a la peticioacuten con las estrofas de

inteligencia Su similar a HTTP GET y HTTP PUT

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Example 1 --

gtltSPANgt lt- Ejemplo 1 -gtltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Client

request --gtltSPANgt lt- Cliente peticioacuten -gtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=julietexamplecombalcony id=rg1 type=getgtltSPANgt

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 30: MatriX Desarrollador Tutorial

from=julietexamplecombalcony ltiq id=rg1 type=getgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqrostergtltSPANgt ltquery

xmlns=jabberiqrostergtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- Server

response --gtltSPANgt lt- De respuesta del servidor -gtltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=rg1

to=julietexamplecomchamber type=resultgtltSPANgt id=rg1 ltiq

to=julietexamplecomchamber type=resultgtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt ltquery

xmlns=jabberiqroster ver=ver7gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=nurseexamplecomgtltSPANgt ltitem

jid=nurseexamplecomgtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtltitem

jid=romeoexamplenetgtltSPANgt ltitem

jid=romeoexamplenetgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 31: MatriX Desarrollador Tutorial

textgtltquerygtltSPANgt lt ConsultagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

El ejemplo anterior es una consulta de noacutemina El cliente solicita la lista de contactos

desde el servidor El tipo de la peticioacuten es conseguir porque el cliente quiere

recuperar la informacioacuten El servidor responde con un tipo de resultado y establece el

identificador para el mismo ID que en la solicitud En rg1 este caso Usted puede

utilizar su propia loacutegica con muchas claacuteusulas if-then-else para asignar la respuesta a

la solicitud de asociados o de la clase IqFilter de la matriz

Cuando se enviacutea una solicitud con la IqFilter puede definir una devolucioacuten de llamada

que se ocupa de la respuesta El IqFilter maneja todo el proceso y aumenta el de

devolucioacuten de llamada de forma automaacutetica cuando el resultado se recibe La loacutegica de

la IqFilter se basa en el coeficiente intelectual es uacutenico id

Asiacutencrono filtro Iq

En este ejemplo se describe el uso asiacutencrono de la IqFilter Una consulta RosterIq se

crean con la clase RosterIq La clase RosterIq asigna automaacuteticamente un

identificador uacutenico para la solicitud Se pasa la consulta estrofa y la devolucioacuten de

llamada se define a los miembros de la SendIq IqFilter Una vez que la matriz recibe

el paquete se planteoacute la devolucioacuten de llamada y quitar de la coleccioacuten IqFilter

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 2ltSPANgt Ejemplo 2ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestRoster()ltSPANgt RequestRoster private void

()ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 32: MatriX Desarrollador Tutorial

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

riq = new RosterIq(IqTypeget)ltSPANgt var = new riq RosterIq

(IqTypeget)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(riq RosterResponse)ltSPANgt

xmppClientIqFilterSendIq (riq RosterResponse)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RosterResponse(object sender IqEventArgs e)ltSPANgt

RosterResponse private void (object sender IqEventArgs e)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

12

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 33: MatriX Desarrollador Tutorial

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtelse if

(iqType == IqTypeerror)ltSPANgt else if (iqType ==

IqTypeerror)ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process errors hereltSPANgt Errores en los procesos aquiacuteltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Sincroacutenica Iq filtro

Por lo general sugieren que los patrones de uso asiacutencrono Pero a menudo los

desarrolladores prefieren la programacioacuten sincroacutenica y en algunos entornos de

programacioacuten sincroacutenica es necesario Usted tambieacuten puede hacer las solicitudes

sincroacutenicas en el IqFilter con el miembro SendIqSynchronous cuando sea necesario

con un tiempo de espera determinado

El tiempo de espera predeterminado es 5000 ms Cuando no se ha recibido respuesta

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 34: MatriX Desarrollador Tutorial

desde el servidor en el tiempo de espera dado el valor devuelto es nulo de lo contrario

el resultado estrofa Iq

el siguiente ejemplo solicita una tarjeta virtual de usuario con un IqFilter siacutencrono con

un tiempo de espera de 2 segundos

Dado que las llamadas sincroacutenicas estaacute utilizando AutoResetEvents que no se pueden

ejecutar desde el hilo de la matriz Hacer esto podriacutea bloquear hasta que llegue el

tiempo de espera y volver siempre es nulo

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

Example 3ltSPANgt Ejemplo 3ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestVcardSynchronous()ltSPANgt

RequestVcardSynchronous private void ()ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

viq = new VcardIq To = userservercom Type = IqTypegetltSPANgt

var = new ViQ VcardIq A = userservercom Tipo =

IqTypegetltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtIq

result = xmppClientIqFilterSendIqSynchronous(viq 2000)ltSPANgt

Resultado Iq = xmppClientIqFilterSendIqSynchronous (ViQ

2000)ltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(result = null)ltSPANgt if (resultado = null)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 35: MatriX Desarrollador Tutorial

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

process result hereltSPANgt Procesar los resultados aquiacuteltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

XPathFilter

El filtro de XPath se puede utilizar para estancias de filtro usando expresiones XPath

El XPathFilter se basa en la XPathSelectElement extensioacuten del espacio de nombres

SystemXmlXPath

Por supuesto que usted puede hacer el filtrado basado en poderosos estados de LINQ

y las otras clases de filtros en la matriz Pero en muchos casos se requiere la

construccioacuten de expresiones de forma dinaacutemica sobre la marcha Tambieacuten muchos

programadores estaacuten familiarizados con XPath y prefieren XPath sobre las

declaraciones de LINQ El XPathFilter hace tambieacuten mucho maacutes faacutecil de filtrar grandes

estrofas compleja con muchos elementos anidados

El siguiente ejemplo describe el uso de la XPathFilter Configuramos un filtro que

coincide con la presencia de todas las estrofas de userjabberorg Matrix el JID

completo Debido a que la matriz y en XPath Net son espacios de nombres que

tenemos que definir los prefijos de la XmlNamespaceManager De lo contrario no

obtendriacutea resultados

eStanza es la completa estrofa que coincide con la expresioacuten

eResult es el resultado de la expresioacuten XPath Esto es uacutetil cuando usted estaacute

interesado soacutelo en fragmentos de la estrofa completa

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 36: MatriX Desarrollador Tutorial

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathFilter()ltSPANgt XPathFilter vaciacuteo ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterXmlNamespaceManagerAddNamespace(JC

jabberclient)ltSPANgt

xmppClientXPathFilterXmlNamespaceManagerAddNamespace (JC

jabber el cliente)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientXPathFilterAdd(JCpresence[from=userjabberorg

MatriX] XPathCallback)ltSPANgt xmppClientXPathFilterAdd ( JC

La presencia de [ from = userjabberorg Matrix]

XPathCallback)ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvoid

XPathCallback(object sender XPathEventArgs e)ltSPANgt vaciacuteo

XPathCallback (object sender XPathEventArgs e)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Stanza + eStanza)ltSPANgt DebugWriteLine

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 37: MatriX Desarrollador Tutorial

(Stanza + eStanza)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Result + eResult)ltSPANgt DebugWriteLine

(Resultado + eResult)ltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Aquiacute estaacuten algunas otras expresiones XPath ejemplo estrofas filtro

filtrar todos los mensajes con el cuerpo exacto de Hola MatriX

JC mensaje [JC cuerpo = Hola Matrix]

filtro de todas las presencias en el JID comienza con Gnauck

JC La presencia de [starts-with ( a Gnauck )]

filtrar todos los mensajes de tipo = error que tienen desde ya y para Jid

JC Mensaje [ y de y type = error]

Registro Registrar una nueva cuenta

ItIt es posible registrar nuevas cuentas en XMPP y con la matriz Pero para la mayoriacutea

de los servicios no su recomendado para permitir la creacioacuten automaacutetica de las cuentas

en XMPP ya que invita a los spammers que pueden utilizar las cuentas como tirar

las direcciones Tambieacuten es maacutes faacutecil en la mayoriacutea de los casos para escribir nuevas

cuentas directamente a la base de datos SQL del servidor usando el lenguaje de

scripting para HTML como ASP PHP y otros

A continuacioacuten se muestra un fragmento de coacutedigo que muestra coacutemo registrar una

nueva cuenta En el caso de OnRegisterInformation requiere el objeto Registro debe

llenarse con los datos Servidores maacutes sencillas como ofrecer a los campos de

nombre de usuario contrasentildea y correo electroacutenico o de registro maacutes amplios sobre

xdata En nuestro ejemplo utilizar los campos de simple nombre de usuario y

contrasentildea y eliminar de xdata

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

XmppClient = new XmppClient()ltSPANgt var = new XmppClient XmppClient

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 38: MatriX Desarrollador Tutorial

()ltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegister += new

EventHandlerltMatrixEventArgsgt(xmppClient_OnRegister)ltSPANgt

xmppClientOnRegister + = new EventHandler ltMatrixEventArgsgt

(xmppClient_OnRegister)ltSPANgt

0

4

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterInformation += new

EventHandlerltMatrixXmppClientRegisterEventArgsgt(xmppClient_OnRegis

terInformation)ltSPANgt xmppClientOnRegisterInformation + = new

EventHandler ltMatrixXmppClientRegisterEventArgsgt

(xmppClient_OnRegisterInformation)ltSPANgt

0

5

ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOnRegisterError += new

EventHandlerltMatrixXmppClientIqEventArgsgt(xmppClient_OnRegisterErr

or)ltSPANgt xmppClientOnRegisterError + = new EventHandler

ltMatrixXmppClientIqEventArgsgt (xmppClient_OnRegisterError)ltSPANgt

06

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetUsername(txtUsernameText)ltSPANgt

xmppClientSetUsername (txtUsernameText)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSetXmppDomain(txtServerText)ltSPANgt

xmppClientSetXmppDomain (txtServerText)ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientPassword = txtPasswordTextltSPANgt

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 39: MatriX Desarrollador Tutorial

xmppClientPassword = txtPasswordTextltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientRegisterNewAccount = trueltSPANgt

xmppClientRegisterNewAccount = trueltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientOpen()ltSPANgt xmppClientOpen ()ltSPANgt

13

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterInformation(object sender

RegisterEventArgs e)ltSPANgt xmppClient_OnRegisterInformation private

void (object sender RegisterEventArgs e)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterRemoveAllltDatagt()ltSPANgt eRegisterRemoveAll

ltDatosgt ()ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterUsername = xmppClientUsernameltSPANgt

eRegisterUsername = xmppClientUsernameltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 40: MatriX Desarrollador Tutorial

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteRegisterPassword = xmppClientPasswordltSPANgt

eRegisterPassword = xmppClientPasswordltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegister(object sender EventArgs

e)ltSPANgt xmppClient_OnRegister private void (object sender EventArgs

e)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration was successfulltSPANgt Registro se realizoacute

correctamenteltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

26

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnRegisterError(object sender

IqEventArgs e)ltSPANgt xmppClient_OnRegisterError private void (object

sender IqEventArgs e)ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 41: MatriX Desarrollador Tutorial

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

registration failedltSPANgt Error de registroltSPANgt

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientClose()ltSPANgt xmppClientClose ()ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

MatriX se extiende

XMPP fue disentildeado para permitir ampliaciones de recuperar el terreno Es muy faacutecil

de definir sus subconjuntos propios del protocolo XMPP y enviarlos a traveacutes del cable

Es muy faacutecil de antildeadir que las extensiones personalizadas para Matrix

En el siguiente ejemplo vamos a crear una simple extensioacuten de un servicio

meteoroloacutegico Vamos a solicitar informacioacuten sobre el clima como la temperatura y la

humedad de un servicio meteoroloacutegico en XMPP Debido a que esta es una solicitud lt-

gt mecanismo de respuesta se utilizaraacute el coeficiente intelectual XMPP estrofa de esta

Disentildeo de protocolos de

en el primer paso que el disentildeo de la representacioacuten XML del protocolo que se va a

utilizar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

request --gtltSPANgt lt- Tiempo pedido -gtltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user1servercomMatriX to=user2servercomMatriX type=get

id=weather1gtltSPANgt from=user1servercomMatriX ltiq

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 42: MatriX Desarrollador Tutorial

to=user2servercomMatriX type=get id=weather1gtltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

07

08

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtlt-- weather

response --gtltSPANgt lt- Tiempo de respuesta -gtltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq

from=user2servercomMatriX to=user1servercomMatriX

type=result id=weather1gtltSPANgt from=user2servercomMatriX

ltiq to=user1servercomMatriX type=result id=weather1gtltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 43: MatriX Desarrollador Tutorial

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumidity gtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemperaturegt24lttemperaturegtltSPANgt ltTemperaturagt 24 lt

temperaturagtltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

En los protocolos XMPP se definen por sus espacios de nombres He elegido el espacio

de nombres agsoftware el tiempo para esta extensioacuten Y he elegido la

ltweathergt nombre de etiqueta del elemento raiacutez Esto tiene sentido ya que XML es

prolija y legible Como los nintildeos del primer nivel del elemento raiacutez del tiempo que se

define

lthumiditygt la humedad como entero devuelto en la respuesta

lttemperaturegt la temperatura como entero devuelto en la respuesta

coacutedigo postal ltzipgt de la ciudad le solicitamos la informacioacuten del tiempo

de Aquiacute en Alemania tenemos los coacutedigos numeacutericos postal de 5 diacutegitos

Dado que este ejemplo debe trabajar en todo el mundo y los otros dos

etiquetas ya son valores enteros que elegir una cadena aquiacute

Clase de disentildeo

Despueacutes de que el disentildeo del protocolo podemos empezar a definir las clases ahora

Para este ejemplo baacutesico vamos a crear dos clases y Weathercs WeatherIqcs

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmlltSPANgt utilizando MatrixXmlltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 44: MatriX Desarrollador Tutorial

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class Weather XmppXElementltSPANgt El tiempo de clase puacuteblica

XmppXElementltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather() base(ag-softwareweather weather)ltSPANgt El tiempo

puacuteblico () base (ag-software el tiempo tiempo)ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int HumidityltSPANgt Humedad public intltSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 45: MatriX Desarrollador Tutorial

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(humidity) ltSPANgt get return GetTagInt

(humedad)ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(humidity value) ltSPANgt conjunto setTag (humedad

valor)ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

16

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

int TemperatureltSPANgt Temperatura public intltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTagInt(temperature)ltSPANgt get return GetTagInt

(temperatura)ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(temperature value)ltSPANgt conjunto setTag

(temperatura valor)ltSPANgt

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 46: MatriX Desarrollador Tutorial

21 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

22

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

string ZipltSPANgt Postal cadena puacuteblicaltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return GetTag(zip) ltSPANgt get return getTag (zip)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

SetTag(zip value) ltSPANgt conjunto setTag (zip

valor)ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

29 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

La clase weathercs que representa nuestra costumbre objeto Xml debe derivar de

XmppXElement XmppXElement se hereda de SystemXmlLinqXElement y es la

base de todas las clases de protocolo XMPP en la matriz

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 47: MatriX Desarrollador Tutorial

XmppXElement tiene muchas funciones de ayuda para serializar y deserializar XML

Usamos getTag y GetTagInt aquiacute que devolver el valor de la etiqueta XML dado como

String o Integer y usamos setTag agregar una etiqueta y establezca su valor como

String o Integer Hay muchas otras funciones de ayuda que hace que sea muy sencillo

de construir complejas estructuras XML Y por supuesto puede utilizar todos los

miembros del poderoso espacio de nombres SystemXmlLinq

Despueacutes de haber escrito esta clase podemos realizar una prueba sencilla para ver si

podemos obtener los resultados deseados

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtprivate void

TestWeather()ltSPANgt TestWeather private void ()ltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = new Weather Zip = 74080 Humidity = 60 Temperature =

22ltSPANgt var tiempo = Tiempo nuevo CP = 74080 Humedad = 60

Temperatura = 22ltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(weather)ltSPANgt DebugWriteLine (tiempo)ltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltSPANgt ltSPANgt

La consola de depuracioacuten muestra el resultado siguiente Esto es lo que

esperaacutebamos

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweather xmlns=ag-

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 48: MatriX Desarrollador Tutorial

softwareweathergtltSPANgt ltweather xmlns=ag-softwareweathergtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlthumiditygt60lthumiditygtltSPANgt lthumiditygt 60 lt humedadgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtlttemeraturegt22lttemeraturegtltSPANgt lttemeraturegt 22 lt

temeraturegtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltweathergtltSPANgt

lt TiempogtltSPANgt

Ahora vamos a crear la clase WeatherIq Esta clase es soacutelo una ayuda para crear

WeatherIq en una forma maacutes faacutecil En lugar de WeatherIqcs tambieacuten podemos utilizar

un objeto de coeficiente intelectual normal y antildeadir el childNode tiempo con el

miembro en Agregar

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtusing

MatrixXmppClientltSPANgt utilizando MatrixXmppClientltSPANgt

02

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtnamespace WeatherExampleltSPANgt espacio de nombres

WeatherExampleltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 49: MatriX Desarrollador Tutorial

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

class WeatherIq IqltSPANgt public class WeatherIq IqltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

WeatherIq()ltSPANgt WeatherIq puacuteblica ()ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtGenerateId()ltSPANgt GenerateId ()ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

11

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtpublic

Weather WeatherltSPANgt El Tiempo puacuteblicaltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 50: MatriX Desarrollador Tutorial

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtget

return ElementltWeathergt() ltSPANgt get ltWeathergt elemento de retorno

()ltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtset

Replace(value) ltSPANgt conjunto Reemplazar (valor)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Nos dirigimos de nuevo una prueba sencilla para crear una solicitud de Iq tiempo con

la nueva clase WeatherIq

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void TestWeatherIq()ltSPANgt private void TestWeatherIq

()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 51: MatriX Desarrollador Tutorial

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

user2servercomMatriXltSPANgt A = user2servercom

MatrixltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = 74080ltSPANgt El tiempo = new

Tiempo CP = 74080ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(wiq)ltSPANgt DebugWriteLine (WIQ)ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Y de nuevo tenemos el resultado que esperaacutebamos No importa el jabber adicionales

la declaracioacuten de espacio de nombres de clientes Que estaacute ahiacute porque se trata de un

fragmento de XML de la completa secuencia XML Cuando se inyecta el paquete en el

flujo de XMPP Xml sus elimina automaacuteticamente ya que el jabber espacio de nombres

de clientes ya se ha declarado en la cabecera del arroyo Matrix es espacios de

nombres que es la razoacuten por la que vemos este declaraciones de espacios de parciales

fragmentos XML

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 52: MatriX Desarrollador Tutorial

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiq id=MX_1

type=get to=user2servercomMatriX xmlns=jabberclientgtltSPANgt

ltiq id=MX_1 type=get to=user2servercomMatriX

xmlns=jabberclientgtltSPANgt

2 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweather xmlns=ag-softwareweathergtltSPANgt ltweather xmlns=ag-

softwareweathergtltSPANgt

3 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltzipgt74080ltzipgtltSPANgt ltzipgt 74080 lt zipgtltSPANgt

4 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltweathergtltSPANgt lt TiempogtltSPANgt

5 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-textgtltiqgtltSPANgt lt

IqgtltSPANgt

Ahora podemos poner las piezas juntas

primero que tenemos que registrar nuestros elementos personalizados en la

faacutebrica El RegisterCustomElements funcioacuten es hacer esto y debe ser llamada

una vez en el comienzo mismo de su aplicacioacuten

RequesWeatherInfo hace tiempo una solicitud para el JID especificado para

un coacutedigo postal determinado La JID debe ser un JID completo La

respuesta de la solicitud es recibida por la devolucioacuten de llamada

WeatherInfoResponse

Para manejar las peticiones entrantes tiempo y responder a ellas nos

suscribimos al controlador de OnIq de la clase XmppClient comprobar si el

coeficiente intelectual de entrada es una solicitud de tiempo lea el coacutedigo

postal la buacutesqueda de los datos del tiempo construir la respuesta y enviarla

de vuelta a la XMPP solicitar entidad

view source

print

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 53: MatriX Desarrollador Tutorial

01 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate static void RegisterCustomElements()ltSPANgt

RegisterCustomElements privado void ()ltSPANgt

02 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

03 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtFactoryRegisterElementltWeathergt(ag-softwareweather

weather)ltSPANgt FactoryRegisterElement ltWeathergt (ag-software

el tiempo tiempo)ltSPANgt

04 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

05

06 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void RequestWeatherInfo(Jid from string zip)ltSPANgt

private void RequestWeatherInfo (JID de zip cadena)ltSPANgt

07 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

08 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

09 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 54: MatriX Desarrollador Tutorial

10 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTypegetltSPANgt Type = IqTypegetltSPANgt

11 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

fromltSPANgt A = altSPANgt

12 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Zip = zip ltSPANgt Tiempo = Tiempo nuevo

postal zip =ltSPANgt

13 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

14 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

pass the zip code as state object to the IqFilterltSPANgt Pasamos

el coacutedigo postal como objeto de estado a la IqFilterltSPANgt

15 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientIqFilterSendIq(wiq WeatherInfoResponse

zip)ltSPANgt xmppClientIqFilterSendIq (WIQ WeatherInfoResponse

coacutedigo postal)ltSPANgt

16 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

17

18 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void WeatherInfoResponse(object sender IqEventArgs

e)ltSPANgt WeatherInfoResponse private void (object sender IqEventArgs

e)ltSPANgt

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 55: MatriX Desarrollador Tutorial

19 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

20 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar iq

= eIqltSPANgt var = iq eIqltSPANgt

21

22 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(iqType == IqTyperesult)ltSPANgt si (== iqType

IqTyperesult)ltSPANgt

23 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

24 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = iqElementltWeathergt()ltSPANgt var tiempo = ltWeathergt

iqElement ()ltSPANgt

25 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(weather = null)ltSPANgt if (tiempo = null)ltSPANgt

26 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

27 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

read the zip code from the stat again because its not contained in

the xml objectltSPANgt Leer el coacutedigo postal de la estadiacutestica una

vez maacutes ya que no su contenido en el objeto xmlltSPANgt

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 56: MatriX Desarrollador Tutorial

28 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

zip = eState as stringltSPANgt var zip = eState como una

cadenaltSPANgt

29

30 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Humidity + weatherHumidity)ltSPANgt

DebugWriteLine (Humedad weatherHumidity +)ltSPANgt

31 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtDebugWriteLine(Temperature + weatherTemperature)ltSPANgt

DebugWriteLine (Temperatura + weatherTemperature)ltSPANgt

32 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

33 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

34 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

35

36 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtprivate void xmppClient_OnIq(object sender IqEventArgs e)ltSPANgt

private void xmppClient_OnIq (object sender IqEventArgs e)ltSPANgt

37 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 57: MatriX Desarrollador Tutorial

textgtltSPANgt ltSPANgt

38 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtif

(eIqType == IqTypeget ampampltSPANgt si (== eIqType IqTypeget amp

ampltSPANgt

39 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgteIqQuery is Weather)ltSPANgt eIqQuery es tiempo)ltSPANgt

40 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

41 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

weather = eIqQuery as WeatherltSPANgt var tiempo = eIqQuery como

el TiempoltSPANgt

42 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtstring

zip = weatherZipltSPANgt zip = cadena weatherZipltSPANgt

43 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

here you should lookup the weather information for the given zip code

in a database or webserviceltSPANgt Aquiacute se debe de buacutesqueda de la

informacioacuten meteoroloacutegica para el coacutedigo postal que figura en una

base de datos o servicio webltSPANgt

44 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt we

just return some random numbersltSPANgt Acabamos de regresar

algunos nuacutemeros aleatoriosltSPANgt

45

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 58: MatriX Desarrollador Tutorial

46 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

temp = new Random()Next(-10 40)ltSPANgt var temp = new Random ()

Siguiente (-10 40)ltSPANgt

47 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

humidity = new Random()Next(10 90)ltSPANgt var humedad = new Random

() siguiente (10 90)ltSPANgt

48

49 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtvar

wiq = new WeatherIqltSPANgt var = new WIQ WeatherIqltSPANgt

50 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

51 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtTo =

eIqFromltSPANgt Para eIqFrom =ltSPANgt

52 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgtType =

IqTyperesultltSPANgt Type = IqTyperesultltSPANgt

53 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtWeather = new Weather Temperature = temp Humidity =

humidityltSPANgt Tiempo = Tiempo nuevo temperatura = temperatura

humedad humedad =ltSPANgt

54 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 59: MatriX Desarrollador Tutorial

55 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-textgt

send the responseltSPANgt Enviar la respuestaltSPANgt

56 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtxmppClientSend(wiq)ltSPANgt xmppClientSend (WIQ)ltSPANgt

57 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

58 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN

style=TEXT-ALIGN left DIRECTION ltr class=google-src-

textgtltSPANgt ltSPANgt

Usted debe ser capaz de copiar y pegar los fragmentos de coacutedigo anteriores en un

nuevo proyecto de una prueba del coacutedigo con dos usuarios diferentes XMPP Tambieacuten

puede ingresar con el mismo usuario dos veces con diferentes recursos y enviar los

paquetes de tiempo de un recurso a la otra

No te olvides de registrar su propio protocolo de clases en la faacutebrica de la matriz

(MatrixXmlFactory)

Cuando las clases no estaacuten registrados en la matriz de la faacutebrica no puede deserializar

el XML para la clase personalizada

Silverlight

Hay diferentes maneras de configurar una conexioacuten XMPP con matriz en Silverlight

1 conexioacuten de socket directa en un puerto dentro del rango de puerto de

Silverlight

2 conexioacuten directa maacutes de un proxy HTTP con el comando CONNECT ( tuacutenel

HTTP )

3 BOSH conexioacuten

Silverlight tiene diferentes restricciones de acceso a la red de seguridad para los

enchufes y las peticiones web Si elige la opcioacuten 1 o 2 y luego la toma de las poliacuteticas

se aplican si opta por 3 entonces la directiva de solicitud web se aplica porque MatriX

estaacute utilizando NET clases WebRequest para las conexiones Leer maacutes detalles sobre

las restricciones de acceso a redes de seguridad Silverlight aquiacute

Dado que Silverlight 4 una solicitud de conexioacuten mediante sockets puede optar por

recuperar el archivo de poliacutetica a traveacutes del protocolo HTTP en el puerto TCP 80 en

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 60: MatriX Desarrollador Tutorial

lugar del protocolo TCP personalizado en el puerto 943 Servidores Web ya estaacuten

funcionando en entornos mosts Esto hace que su instalacioacuten mucho maacutes faacutecil porque

no es necesario que el servidor de poliacuteticas especiales en el puerto 943 Para habilitar

la descarga de la poliacutetica a traveacutes de HTTP utiliza el siguiente coacutedigo en la uacuteltima Matriz

para la versioacuten de Silverlight

view source

print

1 ltSPAN onmouseover=_tipon(this) onmouseout=_tipoff()gtltSPAN style=TEXT-

ALIGN left DIRECTION ltr class=google-src-

textgtXmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

XmppClientDownloadClientAccessPolicyViaHttp = trueltSPANgt

Silverlight permite conexiones de socket soacutelo en los puertos 4502-4534 Para la

opcioacuten 1 y 2 esto significa que usted tiene que configurar el servidor de XMPP o proxy

para escuchar en un puerto dentro de este rango de puertos o usar otras tecnologiacuteas

como la redireccioacuten de puertos para redirigir las conexiones a los valores de XMPP el

puerto 5222 Antes de una toma de corriente pueden ser conectados a las solicitudes

de Silverlight en tiempo de ejecucioacuten de la poliacutetica en el sitio de destino en el puerto

943 y comprueba los permisos Usted tiene que ejecutar un servidor de la poliacutetica que

debe ser capaz de atender las solicitudes en el mismo dominio que el servidor XMPP o

apoderado se encuentra alojado

Cuando se utiliza BOSH y el cruce de las solicitudes de dominios de Silverlight en

tiempo de ejecucioacuten un archivo XML de la raiacutez de la Uri BOSH Esto significa que

puede conectarse a otros servidores XMPP (que no estaacuten bajo su control) soacutelo si estaacuten

habitados por un archivo de poliacutetica en la raiacutez de la Uri BOSH que le permite

conectarse O se ejecuta el servidor de BOSH propia que es capaz de conectarse a

cualquier servidor XMPP en la red federada Punjab es una buena opcioacuten para el

segundo

Ejemplo

cuando el Uri BOSH es httpexamplecom5280http-bind la solicitud de tiempo de

ejecucioacuten de Silverlight un archivo Flash en la poliacutetica

httpexamplecom5280crossdomainxml o un archivo de poliacutetica de Silverlight en

http examplecom 5280clientaccesspolicyxml el cruce de dominios

Para evitar las peticiones entre dominios en su propio servidor puede ya sea

elegir un servidor XMPP que permite alojar la aplicacioacuten en el Uri BOSH

proxy de su servidor web para el servidor por ejemplo BOSH con mod_proxy

en Apache

Glosario BOSH

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 61: MatriX Desarrollador Tutorial

Una teacutecnica para simulatingthe conexioacuten TCP bidrectional asiacutencrono con dos de larga

duracioacuten peticiones HTTP BOSH se utiliza en XMPP para utilizar HTTP como trasport

capa en lugar de TCP

C2S

Conexioacuten de cliente a servidor Cliente XMPP C2S iniciar conexiones a un servidor

XMPP

Jid

El identificador Jabber (JID) es la direccioacuten de una entidad en la red XMPP Estos son

algunos ejemplos de Jids

userdomaincom

userdomaincom Teleacutefono

domaincom

El Jid consta de 3 partes

nodo

dominio

recurso

Alicia examplecom Casa

nodo dominio recurso

Desnudo Jid

Jid sin identificador de recursos por ejemplo userdomaincom

Completo Jid

Jid incluyendo el recurso por ejemplo userdomaincom Home

Lista

La lista de contactos (lista de amigos trade) que se llama lista en XMPP

S2S

Servidor de conexioacuten con el servidor El servidor se comunican entre siacute XMPP a traveacutes

de conexiones S2S

XEP

XEP significa protocolos de extensioacuten XMPP Los protocolos de nuacutecleo XMPP

fueron disentildeados para ser extenible El XMPP Normas Foundation (XSF) mantiene

todos los protocolos de extensioacuten XMPP

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809

Page 62: MatriX Desarrollador Tutorial

XSF

XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs

y promueve el protocolo XMPP

Uacuteltima actualizacioacuten 20111809