应用agsXMPP协议书上迅速构建及时通信手机软件

公布   --中成网建   本案例是基agsXMPP上开发设计的,agsXMPP是C#写的适用开源系统XMPP协议书手机软件,大家能够在agsXMPP上迅速搭建自己的及时通信服务平台,我的这一事例仅仅改动了网络服务器端,由于agsXMPP自身内置的网络服务器端沒有完成闲聊作用、签字和登陆登陆密码验证。

假如你必须开发设计该类及时通信手机软件请与大家联络:

网络服务器端XmppSeverConnection类恶性事件

//在流刚开始时开启,通常为最开始的响应流
streamParser.OnStreamStart += new StreamHandler(streamParser_OnStreamStart);

//在流完毕时开启,通常为推送 /stream:stream 并关掉套接字联接streamParser.OnStreamEnd += new StreamHandler(streamParser_OnStreamEnd);

//在接受到流节点时开启,它是用到数最多的,常见的 message 信息, Presence 参加信息,  IQ 恳求回复信息都会这儿解决
streamParser.OnStreamElement += new StreamHandler(streamParser_OnStreamElement);  

//这里解决大部分份的信息,包含信息路由器
private void streamParser_OnStreamElement(object sender, Node e)
 {
 Console.WriteLine( OnStreamElement:   + e.ToString());
 if (e.GetType() == typeof(Presence))
 {
 // 路由器presences节
 }
 else if (e.GetType() == typeof(Message))
 {
 // 路由器messages节
 }
 else if (e.GetType() == typeof(IQ))
 {
 //解决IQ节
 }
 }  

 

 ///  summary
 /// IQ节解决涵数
 ///  /summary
 ///  param name= iq . /param
 private void ProcessIQ(IQ iq)
 {
 if (iq.Query.GetType() == typeof(Auth))
 {
 Auth auth = iq.Query as Auth;
 this.Username = auth.Username.ToString();

 switch (iq.Type)
 {
 case IqType.get:
 iq.SwitchDirection();
 iq.Type = IqType.result;
 auth.AddChild(new Element( password ));
 auth.AddChild(new Element( digest ));
 Send(iq);
 break;

 case IqType.set:
 // 开展登陆验证
 if (AccountBus.CheckLogin(auth.Username, auth.Digest, this.SessionId))
 {
 iq.SwitchDirection();
 iq.Type = IqType.result;
 iq.Query = null;
 Send(iq);

 Console.WriteLine(auth.Username +  登陆了  +   登陆時间:  + System.DateTime.Now.ToString());

 }
 else
 {
//登陆不成功回到不正确信息内容
 iq.SwitchDirection();
 iq.Type = IqType.error;
 iq.Query = null;
 Send(iq);
 }
 break;
 }
 }
 else if (iq.Query.GetType() == typeof(Roster))
 {
 ProcessRosterIQ(iq);
 }
 }
   

///  summary
 /// 解决IQ节的杂类数据信息.
 ///  /summary
 ///  param name= iq The iq. /param
 private void ProcessRosterIQ(IQ iq)
 {
 if (iq.Type == IqType.get)
 {
 // 推送IQ节的杂类数据信息
 //这儿我用于免费下载朋友目录
 iq.SwitchDirection();
 iq.Type = IqType.result;
 List string  friendList = new List string ();
 friendList = AccountBus.GetFriendName(this.username);
 foreach (string str in friendList)
 {
 RosterItem ri = new RosterItem();
 ri.Name = str.Trim();
 ri.Subscription = SubscriptionType.both;
 ri.Jid = new agsXMPP.Jid(str.Trim() +  @localhost );
 ri.AddGroup( localhost );
 iq.Query.AddChild(ri);
 }
 Send(iq);
 }
 }
 

网络服务器端打开监视5222端口号

 

 

 

 while (running)
 {
 ////
 allDone.Reset();
 // Start an asynchronous socket to listen for connections.
 Console.WriteLine( 等候联接 );

 ept(new AsyncCallback(AcceptCallback), null);

 //// 等候顾客端联接 
 allDone.WaitOne();
 }
eptCallback原始化套接字联接
,并且为顾客端创建一个通讯进程,在建原始化套接字联接选用多线程调
用载入套接字信息内容

 public XmppSeverConnection(Socket sock)
 : this()
 {
 m_Sock = sock;
 m_Sock.BeginReceive(buffer, 0, BUFFERSIZE, 0, new AsyncCallback(ReadCallback), null);
 m_Sock.SendTimeout = 100;
 }

顾客端与网络服务器端的互动全过程


 1顾客端多线程向网络服务器端推送联接恳求

stream:stream to= localhost xmlns= jabber:client xmlns:stream= streams version= 1.0 xml:lang= en

2网络服务器端接到恳求,原始化答复流,并任意转化成一相SessionID

  stream:stream xmlns:stream= streams from= localhost id= 30e3b8c0

3等候网络服务器回到信息后顾客端推送客户名(因为在顾客端选用了多线程启用
方法,因此UI页面觉得不上等候)

iq xmlns= jabber:client id= agsXMPP_1 type= get to= localhost
query xmlns= jabber:iq:auth username test /username /query /iq

4网络服务器端接到客户名等候客户出示登陆密码

iq xmlns= jabber:client from= localhost type= result id= agsXMPP_1
query xmlns= jabber:iq:auth username test /username password /
digest / /query /iq

5顾客端出示数据加密后的登陆密码

iq xmlns= jabber:client id= agsXMPP_2 to= localhost type= set
query xmlns= jabber:iq:auth username test /username
digest e66557d2b67256bf7e9b317a51b6101674a56b5e /digest
resource MiniClient /resource /query /iq

6网络服务器端从数据信息库认证客户名和登陆密码,并回到結果

iq xmlns= jabber:client from= localhost type= result id= agsXMPP_2 /

7假如回到不正确,顾客端提醒并中断联接,不然顾客端推送响应数据信息

8 网络服务器端回到数据信息

9 顾客端推送情况,

10网络服务器接到情况,推送IQ节并通告其他客户.