服务器上安装完成openfire后还要安装mysql数据库吗

服务器上安装完成openfire后还要安装mysql数据库吗,第1张

服务器上安装完成openfire后还要安装mysql数据库吗

openfire设置的配置文件路径为:/openfire/conf/openfirexml。打开xml文件发现安装设置完成后setup的值为true,<setup>true</setup>。首先关闭openfire服务器,然后删除<setup>属性,然后重新启动Openfire并重新装入设置工具。

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的

和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。

Android Cloud to Device Messaging

(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用

程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些

消息。

但是经过一番研究发现,这个服务存在很大的问题:

1)C2DM内置于Android的22系统上,无法兼容老的16到21系统;

2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;

有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的

应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以

参考如下链接:https://labsericssoncom/apis/mobile-java-push/。

3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保

持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允

许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。

前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。

Ø 采用MQTT协议实现Android推送

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现。

架构如下所示:

wmqttjar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

SAM是一个针对MQTT写的PHP库。你可以从这个下载它

send_mqttphp是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。

实例代码:

可以从GitHub上下载实例应用。运行该应用以后,通过手机浏览器访问http://tokuducom/demo/android-push/,在第一个输入框输入设备ID,在第二个输入框输入想要发送的消息内容,按下“Send Push Message”按钮,你就应该可以看到手机上收到了通知了。你也可以从这个GitHub地址上下载android-push源代码,它包含了send_mqttphp脚本。

Ø 采用XMPP协议实现Android推送

这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:

androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,

不过我们不需要自己编译,可以直接把androidpn客户端里面的asmackjar拿来使用。客户端利用asmack中提供的

XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与

openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的

XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,

负责接收用户的Web请求。服务器架构如下:

最上层包含四个组成部分,分别是SessionManager,Auth

Manager,PresenceManager以及Notification

Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence

Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

服务器端界面如下,分别对应了上述的几个功能模块:

发送以后,我们可以在手机端看到接收的消息:

这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

不是加入房间的成员。ios连接openfire房间设置了只容许成员加入,当前帐号非加入房间的成员,故报错,集群连接聊天室报错是由于不是加入房间的成员。openfire是用Java开发的实时协作服务器,是免费的、开源的、基于可拓展通讯和表示协议、采用Java编程语言开发的实时协作服务器,Openfire安装和使用都非常简单,并利用Web进行管理。

android客户端接收 openfire 服务器发送来的消息:

客户端代码如下:

Java代码  

package comexampleopenfiretest;  

  

import orgjivesoftwaresmackChat;  

import orgjivesoftwaresmackChatManager;  

import orgjivesoftwaresmackChatManagerListener;  

import orgjivesoftwaresmackConnectionConfiguration;  

import orgjivesoftwaresmackMessageListener;  

import orgjivesoftwaresmackXMPPConnection;  

import orgjivesoftwaresmackpacketMessage;  

  

import androidosBundle;  

import androidosHandler;  

import androidappActivity;  

import androidcontentIntent;  

import androidviewMenu;  

import androidviewView;  

import androidviewViewOnClickListener;  

import androidviewWindow;  

import androidwidgetCheckBox;  

import androidwidgetEditText;  

import androidwidgetToast;  

  

public class MainActivity extends Activity {  

      

      

      

    private EditText accountEditText;  

    private EditText passwordEditText;  

  

    public void onCreate(Bundle savedInstanceState) {  

        superonCreate(savedInstanceState);  

        requestWindowFeature(WindowFEATURE_NO_TITLE);  

        setContentView(Rlayoutactivity_main);  

        accountEditText = (EditText) findViewById(Ridusername);  

        passwordEditText = (EditText) findViewById(Ridpassword);  

  

        findViewById(Ridlogin)setOnClickListener(new OnClickListener() {  

            public void onClick(View v) {  

                String account = accountEditTextgetText()toString();  

                String password = passwordEditTextgetText()toString();  

                if (accountequals("") || passwordequals("")) {  

                    ToastmakeText(MainActivitythis, "账号或密码不能为空!",  

                            ToastLENGTH_SHORT)show();  

                } else {  

                    ClientConServer ccs = new ClientConServer(MainActivitythis);  

                    boolean b = ccslogin(account, password);  

                    // 如果登录成功  

                    if (b) {  

                        ToastmakeText(MainActivitythis, "登陆成功!",  

                                ToastLENGTH_SHORT)show();  

                          

                          

                    } else {  

                        ToastmakeText(MainActivitythis, "登陆失败!",  

                                ToastLENGTH_SHORT)show();  

                    }  

                }  

            }  

        });  

    }  

      

然后在登陆以后添加一个监听消息的监听器,用来监听收到的消息(代码89、90行): 

Java代码  

package comexampleopenfiretest;  

  

import javautilCollection;  

  

import orgjivesoftwaresmackChat;  

import orgjivesoftwaresmackChatManager;  

import orgjivesoftwaresmackChatManagerListener;  

import orgjivesoftwaresmackConnectionConfiguration;  

import orgjivesoftwaresmackMessageListener;  

import orgjivesoftwaresmackRoster;  

import orgjivesoftwaresmackRosterEntry;  

import orgjivesoftwaresmackRosterGroup;  

import orgjivesoftwaresmackXMPPConnection;  

import orgjivesoftwaresmackXMPPException;  

import orgjivesoftwaresmackpacketMessage;  

  

  

import androidcontentContext;  

import androidcontentIntent;  

import androidosHandler;  

import androidutilLog;  

import androidwidgetToast;  

  

public class ClientConServer {  

    private static int PORT=5222;  

    private Context context;  

    public ClientConServer(Context context){  

        thiscontext=context;  

  

    }  

    //这里收到消息后,通过广播将消息发送到需要的地方哈哈,既然收到了服务器发送来的信息,如何处理自己决定。  

    private Handler handler = new Handler(){    

        public void handleMessage(androidosMessage m) {    

            Message msg=new Message();    

            msg=(Message) mobj;   

            //把从服务器获得的消息通过广播发送    

            Intent intent = new Intent("orgyhnmes");    

            String[] message=new String[]{    

                    msggetFrom(),    

                    msggetBody()};   

            Systemoutprintln("==========收到服务器消息  From==========="+message[0]toString());  

            Systemoutprintln("==========收到服务器消息  Body==========="+message[1]toString());  

            intentputExtra("message", message);    

            contextsendBroadcast(intent);    

        };    

    };  

      

    public boolean login(String a,String p){  

        ConnectionConfiguration config = new ConnectionConfiguration("1921680124", PORT);  

        / 是否启用安全验证 /  

        configsetSASLAuthenticationEnabled(false);  

        / 是否启用调试 /  

        //configsetDebuggerEnabled(true);  

        / 创建connection链接 /  

        XMPPConnection connection = new XMPPConnection(config);  

        try {  

            / 建立连接 /  

            connectionconnect();  

              

              

            / 登录/  

            connectionlogin(a, p);  

            / 开启读写线程,并加入到管理类中/  

            //ClientSendThread cst=new ClientSendThread(connection);  

            //cststart();  

            //ManageClientThreadaddClientSendThread(a, cst);  

              

            //获取用户组、成员信息。  

            Systemoutprintln("======开始获取组及用户==========");  

            Roster roster = connectiongetRoster();  

            Collection<RosterGroup> entriesGroup = rostergetGroups();  

            Systemoutprintln("组的个数:"+entriesGroupsize());  

            for(RosterGroup group: entriesGroup){  

                Collection<RosterEntry> entries = groupgetEntries();  

                Systemoutprintln("=========groupName==="+groupgetName());  

                for (RosterEntry entry : entries) {  

                    //Presence presence = rostergetPresence(entrygetUser());  

                    //Logi("---", "user: "+entrygetUser());  

                    Systemoutprintln("组成员名字:"+entrygetName());  

                    //Logi("---", "tyep: "+entrygetType());  

                    //Logi("---", "status: "+entrygetStatus());  

                    //Logi("---", "groups: "+entrygetGroups());  

                }  

            }  

            Systemoutprintln("======结束获取组及用户==========");  

              

              

            //在登陆以后应该建立一个监听消息的监听器,用来监听收到的消息:  

            ChatManager chatManager = connectiongetChatManager();  

            chatManageraddChatListener(new MyChatManagerListener());  

              

              

            return true;  

        } catch (XMPPException e) {  

            eprintStackTrace();  

        }  

        return false;  

     }  

    / message listener/    

    class MyChatManagerListener implements ChatManagerListener {    

          

          

        public void chatCreated(Chat chat, boolean arg1) {    

            chataddMessageListener(new MessageListener(){    

                public void processMessage(Chat arg0, Message msg) {    

                    /通过handler转发消息/    

                    androidosMessage m=handlerobtainMessage();    

                    mobj=msg;    

                    msendToTarget();   

                      

                      

                }    

            });    

        }   

    }  

}  

启动android客户端,进行登录

然后在openfire的管理控制台,会话-工具中发送消息给所有在线用户

即可看到打印信息:在管理控制台发送的消息

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 服务器上安装完成openfire后还要安装mysql数据库吗

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情