http://www.ox-holdings.com

XMPP的技术来自于Jabber,GCM服务处理排队的消息

摘要Smack是著名的开源XMPP客户端库,另一个开源IM全功能客户端Spark就是基于此库编写的,2017年11月25日Smack正式发由了4.2.2版。前言Smack是著名的开源XMPP客户端库,另一个开源IM全功能客户端Spark就是基于此库编写的(Spark或其修改版被众多国内中小企业作为内部沟通工具),2017年11月25日Smack正式发由了4.2.2版,此版为小幅更新版。更新内容Bug[SMACK-775]

  Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用。

  最进开始做一些android的项目,除了一个新闻客户端的搭建,还需要一个实现一个即时通讯的功能,参考了很多大神成型的实例,了解到operfire+asmack是搭建简易即时通讯比较方便,所以就写了这篇博客。

最近项目会用到openfire相关的知识,前期进行了相关的学习,整理为以下笔记。这篇主要是记录openfire服务器的搭建。

转载请注明出处:

  • Create callback interface for ReconnectionManager[SMACK-778] - ReconnectionManager.reconnect() can throw NotConnectedException[SMACK-779] - smack-android erroneously depends on smack-omemo and smack-omemo-signal[SMACK-780] - PushNotificationManager's isSupported logic does query the server, whereas it should query the bare JID[SMACK-781] - MiniDnsResolver does not correctly handle the case when NOERROR is returned together with an empty answer section.[SMACK-782] - MultiUserChat does not remove the subject listener causing a memory leak[SMACK-783] - InvitationRejectionListener fires multiple times[SMACK-784] - StringUtils.numbersAndLetters has the numbers twice, resulting in a lower entropy[SMACK-785] - OfflineMessageManager.getMessages() does count the pending messages incorrectly, causing an unnecessary delay[SMACK-786] - Race condition when resuming a stream[SMACK-787]
  • Presence.getPriority() may return Integer.MIN_VALUE.详见官方博客:

XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。XMPP的技术来自于Jabber,其实它是 Jabber的核心协定,所以XMPP有时被误称为Jabber协议。Jabber是一个基于XMPP协议的IM应用,除Jabber之外,XMPP还支持很多应用。

一、基础知识(这是复制别人的)

什么是openfire

  • 是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

  • 您可以使用它轻易的构建高效率的即时通信服务器.
    Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
    由于是采用开放的XMPP协议,您可以使用各种支持XMPP协议的IM客户端软件登陆服务.

    这是百度百科给出的解释。

首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量:

转载请注明出处:

XMPP协议简介

XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。

这篇文章有基本的介绍,

XMPP协议简介

  • XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。

  • 想了解更多可以看 XMPP协议分析-原理篇

图片 1

下面就是如何架设内部即时通讯服务的步骤:

IM

Instant Messenger,及时通信软件,就是大家使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基于XMPP 协议的一个实现,其他的则不是。当前IM 几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。设想既然XMPP 协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的IM 应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。

本文主要讲解在android使用xmpp协议进行即时通信,所涉及3个主要的东西,它们是openfire、smack和spark,这个三个东东结合起来就是完整的xmpp IM实现,这里简单介绍一下这3个东东在下文的作用:

openfire主要是作为服务器,负责管理客户端的通信连接,以及提供客户端一些通信信息和连接信息。

Smack主要是xmpp协议的实现,提供了一套很好的api,所以下面操作xmpp都是通过使用smack的api来实现,当然因为是在android里,所以使用的是asmack这个包,里面方法跟smack包差不多。

Spark 是IM客户端的实现,其实就是使用了smack 的api实现的。

Openfire的安装和配置:

    可参考

 二、实现第一步登录

    图片 2图片 3

做好了一系列的前期准备之后我们就能看到这样的用户后台管理了,其中注册了两个用户用来测试。

1.首先可以搭建简易的样式:

 

 图片 4够丑吧=-=

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview"
        android:text="@string/hello_world"
        android:textSize="48dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TableLayout
        android:layout_below="@id/textview"
        android:id="@+id/tablelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TableRow>
            <TextView
                android:layout_height="wrap_content"
                android:text="Name:"
                />
            <EditText
                android:id="@+id/login_name"
                android:hint="Input your Name "
                android:layout_height="wrap_content"
                />
        </TableRow>
        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:text="Password:"
                />
            <EditText
                android:id="@+id/login_password"
                android:hint="Input your Password "
                android:layout_height="wrap_content"
                />
        </TableRow>
    </TableLayout>
    <Button
        android:id="@+id/buttonlogin"
        android:layout_below="@id/tablelayout"
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:text="login in"/>
</RelativeLayout>

一个标题,两个输入,一个Login in的按钮够简单吧!!

2.代码实现:

首先将一些要用的方法封装到工具类里。

 1 public class connect {
 2     private static ConnectionConfiguration connConfig; 
 3     private static XMPPConnection con;
 4 
 5     public static XMPPConnection getConnection() {//获取连接
 6         if (con == null || !con.isConnected()) {
 7             openConnection();
 8         }
 9         return con;
10     }
11     public static boolean openConnection() {//连接方法
12         try {
13             connConfig = new ConnectionConfiguration("192.168.252.1", 5222);   //5222是客户端和服务端的连接端口,其中的ip是我的内网ip
15             // 设置登录状态为离线
16             connConfig.setSendPresence(false);
17             // 断网重连
18             connConfig.setReconnectionAllowed(true);
19             con = new XMPPConnection(connConfig);
20             con.connect();
21             return true;
22         } catch (Exception e) {
23             // TODO: handle exception
24         }
25         return false;
26     }
27     public static void closeConnection() {//断开连接
28         con.disconnect();
29     }

 1     public static boolean login(String account, String password) {
 2         try {
 3             if (connect.getConnection() == null)
 4                 return false;
 5             /** 登录 */
 6             SASLAuthentication.supportSASLMechanism("PLAIN", 0);
 7             connect.getConnection().login(account, password);
 8             // 设置登录状态:在线
 9             // Presence presence = new Presence(Presence.Type.available);
10             // connect.getConnection().sendPacket(presence);
11             return true;
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15         return false;
16     }

 1 public class MainActivity extends ActionBarActivity implements View.OnClickListener {//主函数
 2     public static final int FAIL_CON=0;
 3     public static final int SUCC_CON=0;
 4     private String Tag = "MainAcy";
 5     private String account;
 6     private String pwd;
 7     @Override
 8     protected void onCreate(Bundle savedInstanceState) {
 9         super.onCreate(savedInstanceState);
10         setContentView(R.layout.activity_main);
11 
12      //绑定按钮
13         findViewById(R.id.buttonlogin).setOnClickListener(this);
14 
15     }
16 
17     private android.os.Handler insHandler = new android.os.Handler() {
18         public void handleMessage(android.os.Message msg) {
19             switch (msg.what) {
20                 // 登录成功
21                 case 1:
22                     Toast.makeText(MainActivity.this,"SUCCESS",Toast.LENGTH_SHORT).show();
23                     Log.d(Tag, "login suc");
              //跳转页面
24                     Intent intent=new Intent();
25                     intent.putExtra("usename", account);
              //传值
26                     intent.setClass(MainActivity.this, useractivity.class);
27                     startActivity(intent);
28                     break;
29                 case 0:
30                     Toast.makeText(MainActivity.this,"FAIL",Toast.LENGTH_SHORT).show();
31                     Log.d(Tag, "login fail");
32                     accountLogin();
33                 default:
34                     break;
35             }
36         }
37     };
38 
39     private void accountLogin() {
40         new Thread() {
41             public void run() {
42                 account = ((EditText) findViewById(R.id.login_name))
43                         .getText().toString();
44                 pwd = ((EditText) findViewById(R.id.login_password)).getText()
45                         .toString();
46                 boolean is = ConnecMethod.login(account, pwd);
47                 if (is) {
48                     insHandler.sendEmptyMessage(1);
49                     // 保存用户名
50                     user.UserName = account;
51                 } else {
52                     insHandler.sendEmptyMessage(0);
53                 }
54             };
55         }.start();
56     }
57     
58     @Override
59     public void onClick(View v) {
60         // TODO Auto-generated method stub
61         switch (v.getId()) {
62             case R.id.buttonlogin:
63                 accountLogin();
64             default:
65                 break;
66         }
67     }
68 }

 

我们为下一个页面传递了一个值就是我们登陆的用户名,所以在用户页面要:

 1     @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.useractivity);
 5         Intent intent =getIntent();
 6         String username=intent.getStringExtra("usename");//接收用户名
 7         TextView textView= (TextView) findViewById(R.id.username);再体现在用户页的一个textiew里
 8         textView.setText(username);
 9         connect.closeConnection();
      //使用的连接服务要在登录成功后,即时销毁,否则下一次就会登陆错误。
10     }

这就是第一步的完成,近期不忙就会做下一步的完成。

openfire服务器的搭建

  • 管方下载地址:http://www.igniterealtime.org/downloads/index.jsp#openfire (注:①Openfire是服务器安装包。②Smack主要是xmpp协议的实现,提供了一套很好的api,用来进行客户端开发。③Spark是用Smack开发的一款客户端,可以与服务器进行登录等交互。)

    图片 5

    image

  • 下载好安装包后进行安装

    图片 6

  • 安装很简单,安装完成后,在设置界面会出现图标。

    图片 7

    点击即可打开服务(如果打开服务失败,可能是你的电脑没有安装JAVA环境。安装重试!)

    图片 8

    注:windows用户安装好 在C:Program Filesopenfirebin目录下有一个电灯泡的openfire.exe文件,双击执行,启动完成后可以看到。

    图片 9

    image

  • 安装成功,服务启动成功后,这时候就可以进行服务器设置了。

    选择语言,中文

    图片 10

    服务器地址设置,设置本机IP,本机作为服务器。

    图片 11

    数据库配置,这里选择本地内嵌数据库。外部数据库这里暂时不装。如果需要,根据提示配置相关选项即可。

    图片 12

    这里选择默认设置

    图片 13

    设置你的邮箱和密码,密码为admin账户的密码。

    图片 14

    配置完成

    图片 15

  • 服务器配置完成后,可进行用户管理等操作,登录管理界面如下。

    图片 16

    图片 17

    我们可以在用户管理里面,手动配置一些用户信息。

  • 我们安装打开刚才下载的客户端spark,进行登录操作。

    图片 18

    登录成功,用户变成绿色在线状态。

    图片 19

  • 服务器的搭建这里告一段落,后面会根据相关的API,进行Android端的开发,实现一些和openfire服务器交互的操作。

现在总结下Android平台下几种推送方案的基本情况以及优缺点:

**第一步:安装Jabber服务器软件

  

 

Mac下openfire服务器的卸载

  • 使用官方openfirre的mac安装包时,会把openfire安装在/usr/local/openfire目录下。

    并且配置启动项:/Library/LaunchDaemons/org.jivesoftware.openfire.plist

    以及系统控制面板:/Library/PreferencePanes/Openfire.prefPane

    只需要在openfire关闭的情况下,执行以下的命令即可:

    sudo rm-rf/Library/PreferencePanes/Openfire.prefPane

    sudo rm -rf /usr/local/openfire

    sudo rm-rf/Library/LaunchDaemons/org.jivesoftware.openfire.plist

一、使用GCM(Google Cloude Messaging)

**Jabber服务软件有很多,具体可以参考jabber官方网站的列表:

Android自带的推送GCM可以帮助开发人员给他们的Android应用程序发送数据。它是一个轻量级的消息,告诉Android应用程序有新的数据要从服务器获取,或者它可能是一个消息,其中包含了4KB的payload data(像即时通讯这类应用程序可以直接使用该payload消息)。GCM服务处理排队的消息,并把消息传递到目标设备上运行的Android应用程序。

Jabber官网地址:

优点:Google提供的服务、原生、简单,无需实现和部署服务端。

常用Jabber服务器软件:

缺点:1.要求Android 2.2以上,对于不少2.2以前的系统没法推送;

其中最为方便安装搭建的无疑是Openfire(Wildfire),一款基于GPL协议开源软件,Openfire有linux、windows和MAC的不同版本,软件需要java环境支持,不过软件本身自带了环境包,你可以根据你的需要下载不同的版本。

     2.国内服务不稳定。而且不少国内的终端厂商纷纷把Google的服务去掉,替换上自己的。

下载地址:

     3.需要用户绑定Google账号,但不少国内用户没有Google账号。

最新版本:Openfire 3.3.2

二、使用XMPP协议(Openfire+Spark+Smark)

1、Windows版本安装方法:

XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性,有很强的可扩展性。包括上面讲的GCM服务器底层也是采用XMPP协议封装的。

下载:openfire_3_3_2.exe带java环境版本

优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。

安装:直接运行安装文件,程序默认安装至c:Program FilesOpenfire

缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。

运行:binopenfire.exe

而androidpn(Android Push Notification)就是基于 XMPP 开源组件的一套整合方案,服务端基于Openfire、客户端基于Smack。到AndroidPN项目主页( ) 下载2个文件: androidpn-server-0.5.0-bin.zip 和 androidpn-client-0.5.0.zip 分别是服务器和客户端的代码。详细的实现方式网上有不少文章。

 

  1.androidpn服务端重启后客户端不会重连,这个非常悲剧

2、Linux/Unix版本安装方法

  2.由于服务器不保存消息,造成了如果客户端当前离线就收不到消息

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。