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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
= 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
view source
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
view source
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Api-Key
Api-Secret
Sesioacuten-Key
El siguiente ejemplo muestra coacutemo utilizar la autenticacioacuten X-FACEBOOK-plataforma
view source
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
view source
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
(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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
(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
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
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
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
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
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
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
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
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
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
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
()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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
XSF
XSF significa XMPP Normas Fundacioacuten la organizacioacuten de normas que define el XEPs
y promueve el protocolo XMPP
Uacuteltima actualizacioacuten 20111809
Recommended