`
houchangxi
  • 浏览: 64669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于 XMPP协议的即时消息服务端简单实现

阅读更多


文章分类:JavaEye

服务器端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("等待连接");

                    listener.BeginAccept(new AsyncCallback(AcceptCallback), null);

                    //// 等待客户端连接                    
                     allDone.WaitOne();
                }


 

 

如果收到客户端请求就异步调用AcceptCallback初始化套接字连接
,并为客户端建立一个通信线程,新建初始化套接字连接采用异步调
用读取套接字信息

 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='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'>

2服务器端收到请求,初始化回应流,并随机生成一相SessionID

 <stream:stream xmlns:stream="http://etherx.jabber.org/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节并通知其它用户.

分享到:
评论

相关推荐

    net平台 基于 XMPP协议的即时消息服务端简单实现

    ### .NET平台基于XMPP协议的即时消息服务端简单实现 #### 一、XMPP协议简介 XMPP(可扩展消息与存在协议)是一种基于XML的开放标准协议,主要用于即时通讯(IM)系统,文件传输,游戏引擎,物联网(IoT),以及...

    基于Xmpp协议的即时通讯社交软件(客户端+服务端)

    开源一个自己去年写的基于Xmpp协议的即时通讯社交软件(客户端+服务端) 本项目仅供参考,对于正在学习Xmpp以及javaweb后台的同学,可以看一下。 做这个项目纯属个人兴趣爱好,所以即时通讯做的不是很深,只是简单的...

    Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现.zip

    1. **XMPP协议**:XMPP是一种开放标准的实时通信协议,它基于XML流传输,广泛应用于即时消息、在线状态跟踪和文件传输。XMPP的核心设计使其能够处理大量并发连接,支持多用户聊天、群组功能和跨域通信,因此非常适合...

    基于XMPP协议的消息推送(内含有服务器和客户端)一看就懂 简单实用

    **XMPP协议详解** ...通过`androidpn-server-0.5.0`和`androidpn-client-0.5.0`,我们可以构建一个完整的基于XMPP的Android消息推送系统,让开发者能够高效地实现实时通信功能,同时为用户提供流畅的用户体验。

    Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码

    在本文中,我们将深入探讨如何使用XMPP协议在Android平台上实现一个完整的即时通讯(IM)系统,包括客户端和服务器端的实现。XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,广泛用于...

    基于XMPP协议企业级IM的研究与实现

    ### 基于XMPP协议企业级IM的研究与实现 #### 概述 近年来,随着互联网技术的迅猛发展,即时通信(Instant Messaging, IM)工具因其便捷性和高效性,在人们的日常生活和工作中扮演着越来越重要的角色。特别是在企业...

    Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现.

    Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现。实现了注册,登录,读取好友列表,搜索好友,添加分组,添加好友,删除好友,修改心情,两个客户端之间的信息发送与接收,监听发送来的好友...

    基于XMPP协议的视频会议系统C#源码

    标题中的“基于XMPP协议的视频会议系统C#源码”指的是一个使用C#编程语言实现的、基于XMPP(Extensible Messaging and Presence Protocol)协议的视频会议系统。XMPP是一种开放标准的即时通讯协议,它允许用户进行...

    基于xmpp协议通讯

    【标题】:“基于xmpp协议通讯” XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,它基于XML并被广泛用于构建实时通信系统,如聊天应用、协作工具和物联网设备之间的通信。该标题...

    基于Jabber/XMPP 的即时通讯系统的设计与实现

    ### 基于Jabber/XMPP的即时通讯系统设计与实现——远程教育视角 #### 引言 随着互联网的迅速发展与普及,即时通讯(Instant Messaging, IM)已成为现代社会沟通的重要工具。它不仅提供了便捷的信息传递方式,还...

    基于XMPP协议的校园实时消息推送系统的研究.pdf

    本文针对校园移动设备用户获取即时消息的问题,提出了一种基于XMPP协议实现校园实时消息推送的方法,并针对其实现方式展开了讨论与研究.在开源软件系统OpenFire的支持基础上,提出了面向校园的服务端和...

    Android应用源码基于XMPP的即时聊天项目.rar

    总之,这个项目提供了一个完整的Android即时通讯应用的实现,涉及了Android开发、Java编程、XMPP协议、Openfire服务器和Asmack库的使用。对于想要学习Android即时通讯或对XMPP有兴趣的开发者来说,这是一个非常有...

    XMPP协议中文版

    XMPP协议,全称为可扩展的消息和出席信息协议(Extensible Messaging and Presence Protocol),是一种基于XML的即时消息和出席信息交换的标准协议。该协议最初由Jabber开源社区在1999年开发,后被IETF(Internet ...

    smack源码,3.2版本的,基于xmpp的即时通讯客户端

    Smack是一款开源的Java库,专为实现基于XMPP(Extensible Messaging and Presence Protocol)的即时通讯应用而设计。XMPP是一种开放标准,广泛用于创建实时通信系统,如聊天、协作工具、物联网设备通信等。在3.2版本...

    即时通信服务端数据库 QQ IM

    1. **即时通信协议**:即时通信系统通常基于特定的协议来实现,如XMPP(Extensible Messaging and Presence Protocol)、MQTT(Message Queuing Telemetry Transport)或专有的QQ协议。这些协议定义了用户如何连接、...

    xmpp协议 中文版

    XMPP协议的核心是基于XML的数据格式进行消息传输。所有的XMPP数据都以XML格式编码,并且通过TCP进行传输。这意味着客户端和服务端必须能够解析和生成有效的XML文档,以确保通信的正确性和安全性。 ##### 2.3 客户端...

    openfire 4.1.5最新安装包

    基于XMPP协议即时通讯服务端(openfire)最新版4.1.5安装包

    xmpp下的即时聊天客户端

    这个标题“xmpp下的即时聊天客户端”暗示我们将探讨使用XMPP协议构建的即时聊天应用程序,而描述中提到的“还有服务端”,意味着讨论将包括客户端与服务器端的交互。 XMPP的核心设计原则是分散式和标准化,它允许...

    基于Agent的Jabber即时消息系统研究及其实现

    为了解决这一问题,本文介绍了一种基于Jabber协议的即时消息系统,该系统能够实现跨平台、跨服务的即时通讯,极大地方便了用户的日常使用。 #### 二、Jabber协议与实现方法 ##### 2.1 Socket基本原理 Socket(套...

Global site tag (gtag.js) - Google Analytics