xmpp学习

XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议——Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段。

为了防止服务器间发送的数据被篡改或偷听,XMPP服务器通信引入了TLS机制,使用TLS机制能实现数据的加密,从而保证了在数据传输过程种数据的安全。

一个XMPP实体的地址称为JabberIdentifier或JID,作用类似于IP地址。一个合法的JID包括节点名,域名资源名,其格式为:jid=[node'@']domain['/'resource]

XMPP协议的命名空间:
jabber:iq:private --私有数据存储,用于本地用户私人设置信息,比如用户备注等。
jabber:iq:conference -- 一般会议,用于多个用户之间的信息共享
jabber:x:encrypted-- 加密的消息,用于发送加密消息
jabber:x:expire-- 消息终止
jabber:iq:time-- 客户端时间
jabber:iq:auth--简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证
jabber:x:roster-- 内部花名册
jabber:x:signed-- 标记的在线状态
jabber:iq:search-- 用户数据库查询,用于向服务器发送查询请求
jabber:iq:register-- 注册请求,用于用户注册相关信息
jabber:x:iq:roster-- 花名册管理
jabber:x:conference-- 会议邀请,用于向参加会议用户发送开会通知
jabber:x:event-- 消息事件
vcard-temp--临时的vCard,用于设置用户的头像以及昵称等

在网上找了下,有开源的项目BEEM,开源的用于Android的xmpp框架asmack,asmack是smack的android版本。现在开始学习smack

。Xmpp就是神马东西,就不废话了。首先在网上下一个Openfire和Spack,不知道这两个是什么东西,就直接google吧。安装openfire需要mysql的支持,当然,oracle,sqlserver肯定是可以的。还是先上图吧:

Openfire + Spark + MyXMPPP

  1. importjava.io.InputStreamReader;
  2. importjava.util.Collection;
  3. importorg.jivesoftware.smack.Chat;
  4. importorg.jivesoftware.smack.ChatManager;
  5. importorg.jivesoftware.smack.ChatManagerListener;
  6. importorg.jivesoftware.smack.ConnectionConfiguration;
  7. importorg.jivesoftware.smack.MessageListener;
  8. importorg.jivesoftware.smack.PrivacyListManager;
  9. importorg.jivesoftware.smack.Roster;
  10. importorg.jivesoftware.smack.RosterEntry;
  11. importorg.jivesoftware.smack.RosterGroup;
  12. importorg.jivesoftware.smack.RosterListener;
  13. importorg.jivesoftware.smack.XMPPConnection;
  14. importorg.jivesoftware.smack.packet.Message;
  15. importorg.jivesoftware.smack.packet.Presence;
  16. publicclassTestSmack{
  17. publicstaticvoidmain(String[]args){XMPPConnection.DEBUG_ENABLED=true;
  18. //我的电脑IP:10.16.25.90
  19. finalConnectionConfigurationconnectionConfig=newConnectionConfiguration("10.16.25.91",5222,"");
  20. connectionConfig.setSASLAuthenticationEnabled(false);
  21. try{
  22. XMPPConnectionconnection=newXMPPConnection(connectionConfig);
  23. connection.connect();//连接
  24. connection.login("test","test");//登陆
  25. System.out.println(connection.getUser());
  26. ChatManagerchatmanager=connection.getChatManager();
  27. //新建一个会话
  28. ChatnewChat=chatmanager.createChat("test3@pc2010102716",newMessageListener(){
  29. publicvoidprocessMessage(Chatchat,Messagemessage){
  30. System.out.println("Receivedfrom【"+message.getFrom()+"】message:"+message.getBody());
  31. }
  32. });
  33. //监听被动接收消息,或广播消息监听器
  34. chatmanager.addChatListener(newChatManagerListener(){
  35. @Override
  36. publicvoidchatCreated(Chatchat,booleancreatedLocally){
  37. chat.addMessageListener(newMessageListener(){
  38. @Override
  39. publicvoidprocessMessage(Chatchat,Messagemessage){
  40. System.out.println("Receivedfrom【"+message.getFrom()+"】message:"+message.getBody());
  41. }
  42. });
  43. }
  44. });
  45. //发送消息
  46. newChat.sendMessage("我是菜鸟");
  47. //获取花名册
  48. Rosterroster=connection.getRoster();
  49. Collectionentries=roster.getEntries();
  50. for(RosterEntryentry:entries){
  51. System.out.print(entry.getName()+"-"+entry.getUser()+"-"+entry.getType()+"-"+entry.getGroups().size());
  52. Presencepresence=roster.getPresence(entry.getUser());
  53. System.out.println("-"+presence.getStatus()+"-"+presence.getFrom());
  54. }
  55. //添加花名册监听器,监听好友状态的改变。
  56. roster.addRosterListener(newRosterListener(){
  57. @Override
  58. publicvoidentriesAdded(Collectionaddresses){
  59. System.out.println("entriesAdded");
  60. }
  61. @Override
  62. publicvoidentriesUpdated(Collectionaddresses){
  63. System.out.println("entriesUpdated");
  64. }
  65. @Override
  66. publicvoidentriesDeleted(Collectionaddresses){
  67. System.out.println("entriesDeleted");
  68. }
  69. @Override
  70. publicvoidpresenceChanged(Presencepresence){
  71. System.out.println("presenceChanged->"+presence.getStatus());
  72. }
  73. });
  74. //创建组
  75. ///RosterGroupgroup=roster.createGroup("大学");
  76. //for(RosterEntryentry:entries){
  77. //group.addEntry(entry);
  78. //}
  79. for(RosterGroupg:roster.getGroups()){
  80. for(RosterEntryentry:g.getEntries()){
  81. System.out.println("Group"+g.getName()+">>"+entry.getName()+"-"+entry.getUser()+"-"+entry.getType()+"-"+entry.getGroups().size());
  82. }
  83. }
  84. //发送消息
  85. BufferedReadercmdIn=newBufferedReader(newInputStreamReader(System.in));
  86. while(true){
  87. try{
  88. Stringcmd=cmdIn.readLine();
  89. if("!q".equalsIgnoreCase(cmd)){
  90. break;
  91. }
  92. newChat.sendMessage(cmd);
  93. }catch(Exceptionex){
  94. }
  95. }
  96. connection.disconnect();
  97. System.exit(0);
  98. }catch(Exceptione){
  99. e.printStackTrace();
  100. }
  101. }
  102. }
  103. 以上代码如果在一般的JavaProject上运行需要加入smack.jar和klmx2.jar,如果是AndroidProject,基本代码不需改变只需将其放入onCreate(...)方法下即可,需要加入asmack.jar包.

    1、ConnectionConfiguration
    作为用于与XMPP服务建立连接的配置。它能配置;连接是否使用TLS,SASL加密。
    包含内嵌类:ConnectionConfiguration.SecurityMode

    2、XMPPConnection.
    XMPPConnection这个类用来连接XMPP服务.
    可以使用connect()方法建立与服务器的连接。disconnect()方法断开与服务器的连接.
    在创建连接前可以使用XMPPConnection.DEBUG_ENABLED = true;使开发过程中可以弹出一个GUI窗口,用于显示我们的连接与发送Packet的信息。

    3、ChatManager
    用于监控当前所有chat。可以使用createChat(String userJID,MessageListener listener)创建一个聊天。

    4、Chat
    Chat用于监控两个用户间的一系列message。使用addMessageListener(MessageListenerlistener)当有任何消息到达时将会触发listener的processMessage(Chat chat, Messagemessage)
    方法.
    我们可以使用sendMessage()发送消息,这个方法有两个重载方法,一种类类型的参数时String类型,另一种则是传入Message对象(后面介绍)。
    那么有这样一种情况,当别人主动跟我们建立连接发送消息,或者系统发送消息时我们怎么才能接收消息呢?
    我现在是这样操作的:
    chatmanager.addChatListener(newChatManagerListener() {
    @Override
    public void chatCreated(Chatchat, boolean createdLocally) {
    chat.addMessageListener(newMessageListener() {
    @Override
    publicvoid processMessage(Chat chat, Message message) {
    System.out.println("Receivedmessage: " + message.getBody());
    }

    });
    }
    });

    5、Message
    Message用于表示一个消息包(可以用调试工具看到发送包和接收包的具体内容)。它有以下多种类型。
    Message.Type.NORMAL --(默认)文本消息(比如邮件)
    Message.Type.CHAT--典型的短消息,如QQ聊天的一行一行显示的消息
    Message.Type.GR OUP_CHAT--群聊消息
    Message.Type.HEADLINE--滚动显示的消息
    Message.TYPE.ERROR--错误的消息
    Message有两个内部类:
    Message.Body -- 表示消息体
    Message.Type -- 表示消息类型

    6、Roster
    表示存储了很多RosterEntry的一个花名册.为了易于管理,花名册的项被分贝到了各个group中.
    当建立与XMPP服务的连接后可以使用connection.getRoster()获取Roster对象。
    别的用户可以使用一个订阅请求(相当于QQ加好友)尝试订阅目的用户。可以使用枚举类型Roster.SubscriptionMode的值处理这些请求:
    accept_all: 接收所有订阅请求
    reject_all:拒绝所有订阅请求
    manual: 手工处理订阅请求

    创建组:RosterGroup group =roster.createGroup("大学");
    向组中添加RosterEntry对象: group.addEntry(entry);

    7、RosterEntry
    表示Roster(花名册)中的每条记录.它包含了用户的JID,用户名,或用户分配的昵称.

    8、RosterGroup
    表示RosterEntry的组。可以使用addEntry(RosterEntryentry)添加。contains(String user) 判断某用户是否在组中.当然removeEntry(RosterEntryentry)就是从组中移除了。getEntries()

    获取所有RosterEntry.

    9、Presence
    表示XMPP状态的packet。每个presencepacket都有一个状态。用枚举类型Presence.Type的值表示:
    available -- (默认)用户空闲状态
    unavailable -- 用户没空看消息
    subscribe -- 请求订阅别人,即请求加对方为好友
    subscribed -- 统一被别人订阅,也就是确认被对方加为好友
    unsubscribe -- 他取消订阅别人,请求删除某好友
    unsubscribed -- 拒绝被别人订阅,即拒绝对放的添加请求
    error -- 当前状态packet有错误
    xmpp学习
    内嵌两个枚举类型:Presence.Mode和Presence.Type.
    可以使用setStatus自定义用户当前的状态(像QQ一样的)


  

爱华网本文地址 » http://www.413yy.cn/a/25101014/235510.html

更多阅读

photoshop学习教程

photoshop学习教程——简介photoshop是一款强大的图片处理软件,用它强大的功能,可以使我们达成很多目的。今天我就来教大家用ps去水印的方法。photoshop学习教程——工具/原料?psphotoshop学习教程——方法/步骤photoshop学习教程 1

四快学习法的价格问题

四快学习法的价格问题——简介随着现在的四快学习法的逐渐在我国的各个区域市场的畅销,很多的学生家长都开始积极地关注到这样的热门的教辅材料,因为很多人都想要了解到四快学习法的神奇之处,想要知道为什么简单的教辅方法就能够改

五笔打字学习教程:1 初学五笔的疑问解答

五笔打字学习教程:[1]初学五笔的疑问解答——简介一步一步地教会你使用五笔输入法打字,最终成为打字高手。请看我的系列经验。五笔打字学习教程:[1]初学五笔的疑问解答——工具/原料五笔输入法五笔打字学习教程:[1]初学五笔的疑问解答

洛克王国,怎样学习百变液化术?

洛克王国的百变液化术要怎么学习呢?洛克王国,怎样学习百变液化术?——学习方法洛克王国,怎样学习百变液化术? 1、点开任务档案-成长之路-魔法之路-液化术课程选择现在就过去! 洛克王国,怎样学习百变液化术? 2、来到实验工坊点击爱因斯坦对

关于儿童学习跆拳道的几个问题

关于儿童学习跆拳道的几个问题——简介练习跆拳道能提高吃苦耐劳的能力.无论练习哪种武术,都是要下苦功夫的,一个动作为了做的标准,有力量、有速度,可能要练习成百上千次,没有吃苦耐劳的精神是做不到的.强身健体.跆拳道也是一项体育竞技,

声明:《xmpp学习》为网友只为吻你才低头分享!如侵犯到您的合法权益请联系我们删除