`

XMPP——Smack[1]连接、登陆及账户操作、会话、消息监听、字体表情和聊天窗口控制

 
阅读更多

一、XMPP

XMPP : The Extensible Messaging and Presence Protocol

中文全称:可扩展通讯和表示协议

简介:

可扩展通讯和表示协议 (XMPP) 可用于服务类实时通讯、表示和需求 - 响应服务中的 XML 数据元流式传输。XMPP  Jabber 协议为基础,而 Jabber 是即时通讯中常用的开放式协议。

 

二、Smack

    Smack是一个开源,易于使用的XMPPjabber)客户端类库。

   Smack API, 是一个 Java XMPP Client Library,也是由Jive Software开发。 优点:编程简单。 缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,1台机器只能模拟有限(数千个)客户.

smack是一个用 java 写的XMPP客户端代码库 spark 的核心.

 

二、连接及断开

基本方法

 XMPPConnection connection = new XMPPConnection("gmail.com");

        connection.connect();

实现的方法

 

 

 

  1. public static XMPPConnection getConnection(String domain) throws XMPPException {  
  2.       
  3.      XMPPConnection connection = new XMPPConnection(domain);  
  4.      connection.connect();  
  5.      return connection;  
  6. }  
  7.   
  8.   
  9. public static XMPPConnection getConnection(String domain,int port) throws XMPPException {  
  10.      ConnectionConfiguration config = new ConnectionConfiguration(domain,port);  
  11.      XMPPConnection connection = new XMPPConnection(config);  
  12.      connection.connect();  
  13.      return connection;  
  14. }  

 

 

断开  

     connection.disconnect();

     

四、登陆

connection.login("javatest2011@gmail.com", "*****");

 

 

五、账户操作

 

   可以对账户进行基本操作,包括注册,注销,修改密码

[c-sharp] view plaincopyprint?
 
  1. /** 
  2.      * 注册用户 
  3.      * @param connection 
  4.      * @param regUserName 
  5.      * @param regUserPwd 
  6.      * @return 
  7.      */  
  8.     public static boolean createAccount(XMPPConnection connection,String regUserName,String regUserPwd)  
  9.     {  
  10.         try {  
  11.             connection.getAccountManager().createAccount(regUserName, regUserPwd);  
  12.             return true;  
  13.         } catch (Exception e) {  
  14.             return false;  
  15.         }  
  16.     }  
  17.       
  18.     /** 
  19.      * 删除当前用户 
  20.      * @param connection 
  21.      * @return 
  22.      */  
  23.     public static boolean deleteAccount(XMPPConnection connection)  
  24.     {  
  25.         try {  
  26.             connection.getAccountManager().deleteAccount();  
  27.           
  28.             return true;  
  29.         } catch (Exception e) {  
  30.             return false;  
  31.         }  
  32.     }  
  33.       
  34.     /** 
  35.      * 删除修改密码 
  36.      * @param connection 
  37.      * @return 
  38.      */  
  39.     public static boolean changePassword(XMPPConnection connection,String pwd)  
  40.     {  
  41.         try {  
  42.             connection.getAccountManager().changePassword(pwd);  
  43.           
  44.             return true;  
  45.         } catch (Exception e) {  
  46.             return false;  
  47.         }  
  48.     }  

 

 XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制

 

拿到了connection,通过它可以搞定会话

 

 

1.       建立一个会话

 

  1. MessageListener msgListener  
  2.  = new MessageListener()  
  3.         {  
  4.             public void processMessage(Chat chat, Message message)  
  5.             {  
  6.   
  7.                 if (message != null && message.getBody() != null)  
  8.                 {  
  9.                     System.out.println("收到消息:" + message.getBody());  
  10.                     // 可以在这进行针对这个用户消息的处理,但是这里我没做操作,看后边聊天窗口的控制  
  11.                 }  
  12.   
  13.             }  
  14.         };  
  15. Chat chat = Client.getConnection().getChatManager()  
  16.                 .createChat(userName, msgListener);  

 

 

 

通过会话发送消息

两个方法,一个直接发送一条文本,一个发送一个Message对象,可包含一些信息,一般使用后者,因为需要包装字体等信息

  1. public static void sendMessage(Chat chat,String message) throws XMPPException {  
  2.         chat.sendMessage(message);  
  3.     }  
  4.       
  5.     public static void sendMessage(Chat chat,Message message) throws XMPPException {  
  6.         chat.sendMessage(message);  
  7.     }  

 

 

 

2.       消息监听

每个connectionchatManager可以设置一个消息监听器,因为IM必须实现他人对你发起会话也会弹出窗口,即自己可以主动发起会话,也可以接收他人发起的会话

 

  1. ChatManager manager = Client.getConnection().getChatManager();  
  2.         manager.addChatListener(new ChatManagerListener() {  
  3.             public void chatCreated(Chat chat, boolean arg1) {  
  4.                 chat.addMessageListener(new MessageListener() {  
  5.                     public void processMessage(Chat arg0, Message message) {  
  6.                      //若是聊天窗口已存在,将消息转往目前窗口  
  7.                      //若是窗口不存在,开新的窗口并注册  
  8.   
  9.                     }     
  10.                 });  
  11.             }  
  12.         });  

 

   其实窗口的管理是使用线程的,来一个新的会话,起线程

 

3.  字体表情

在这里实现字体和表情是使用自身开发IM之间的实现。

 

字体实现思想:

在发送消息的同时,将字体内容作为附加信息发送,接收方接收到根据字体信息进行处理后显示

  

   实现:使用Message对消息进行封装

 

 

  1. Message msg = new Message();  
  2.         msg.setProperty("size", size);  
  3.         msg.setProperty("kind", kind);  
  4.         msg.setProperty("bold", bold);  
  5.         msg.setProperty("italic", italic);  
  6.         msg.setProperty("underline", underline);  
  7.         msg.setProperty("color", color);  
  8.         msg.setBody(getSendInfo());//真正的消息  
  9.         chat.sendMessage(msg);  

 

 

 

接收方先获取设置信息后展示

       展示的控件: JTextPane receiveText = new JTextPane();

 

  1. Style style = receiveText.addStyle("font"null);  
  2.         StyleConstants.setFontSize(style, size);  
  3.         StyleConstants.setFontFamily(style, kind);  
  4.         StyleConstants.setBold(style, bold);  
  5.         StyleConstants.setItalic(style, italic);  
  6.         StyleConstants.setUnderline(style, underline);  
  7.         StyleConstants.setForeground(style, color);  

 

 

  表情:

       实现机制是客户端本身存有一套表情图片,在选中时,将表情编号加入到消息中,实际发送出去的只是文本,拿到后解析字符串,将编号转为具体表情展示

      具体就不写了

 

 

1.  聊天窗口控制

所谓控制,主要是控制唯一性

无论是你发起一个会话开启一个窗口,还是对方给你发送会话开启,你与对方之间有且仅有一个窗口,之后任何消息都在这个窗口中处理

 

思想:单例类,持有一个

//现有的聊天窗口

    public static TreeMap<String,TelFrame> currentChat = new TreeMap<String,TelFrame>();

 

其实应该用concurrentHashMap可能会更好,不顾我这边分派的主线程只有一个,不涉及多个线程并发的问题,所以用了Treemap,汗一个,貌似应该hashmap,当时考虑不同

 

然后,在接收消息的时候根据发消息的用户,判定窗口是否存在,存在,转发消息到该窗口,不存在,建立新的窗口

若是关闭窗口,注销之

 

 

 

  1. //注册聊天室  
  2.     public static void registerChat(String userName,TelFrame chatroom)  
  3.     {  
  4.         //System.out.println("注册:"+userName);  
  5.         currentChat.put(userName, chatroom);  
  6.     }  
  7.     //注销注册  
  8.     public static void removeChat(String userName)  
  9.     {  
  10.         System.out.println("用户注销聊天室:"+userName);  
  11.         currentChat.remove(userName);  
  12.     }  
  13.     //查看是否已有  
  14.     public static boolean isChatExist(String userName)  
  15.     {  
  16.           
  17.         return currentChat.containsKey(userName);  
  18.     }  
  19.     //获取对象  
  20.     public static TelFrame getChatRoom(String userName)  
  21.     {  
  22.         return currentChat.get(userName);  
  23.     }  

 

 

 

 

分享到:
评论

相关推荐

    安卓xmpp通讯之smack4.1.9

    综上所述,Smack 4.1.9在Android上的应用涉及到XMPP协议的基础知识,包括连接、身份验证、会话管理、消息传递和文件传输等功能。开发者可以借助这些工具,结合“releasedocs”和“javadoc”的帮助,构建出高效、可靠...

    Android Smack 注册登陆,单聊,群聊消息监听

    总结,使用Android Smack库开发即时通讯应用,开发者需要理解XMPP协议的基础概念,掌握Smack的初始化、连接、注册登录、消息发送与接收以及监听机制。通过实践和不断优化,可以构建出高效、稳定的IM系统。对于初学者...

    基于xmpp_openfire_smack开发之smack类库介绍和使用

    Smack 是一个强大的开源 Java 库,专门用于处理 XMPP(可扩展消息处理和存在协议)通信。XMPP 是一种实时通信协议,广泛应用于即时消息、VoIP 和在线游戏等场景。Openfire 是一个流行的 XMPP 服务器,而 Smack 则是...

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

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

    android的XMPP客户端

    Smack库包含连接管理、会话建立、消息发送和接收等功能,大大简化了开发过程。在集成Smack库时,确保下载对应的Android版本,并将其添加到项目的build.gradle文件中。 接下来,我们需要配置Android Studio项目,...

    安卓Android源码——基于XMPP协议的多帐号聊天.zip

    《安卓Android源码——基于XMPP协议的多帐号聊天》 在移动通信领域,实时通讯功能已经成为各种应用程序不可或缺的一部分。Android平台提供了丰富的API和工具,使得开发者能够构建复杂且高效的应用,其中包括聊天...

    安卓Android源码——简洁XMPP.zip

    在源码中,"XMPPClient"可能是一个核心类,负责与XMPP服务器建立连接、发送和接收消息。这个类通常会包含以下几个关键部分: 1. **连接管理**:初始化XMPP连接,包括设置服务器地址、端口、用户名和密码。使用...

    Android使用XMPP协议、OpenFire服务器和Smack类库实现即时通信

    XMPP是一种基于XML的开放标准,用于即时消息传递和在线状态跟踪,它允许用户进行实时通信,适用于多对多的交流场景。本篇文章将深入探讨如何利用XMPP协议,结合OpenFire服务器以及Smack类库,在Android项目中构建一...

    Android smack 接收 发送消息 表情发送

    本教程将基于标题"Android Smack 接收 发送消息 表情发送",以及描述中的内容,详细讲解如何利用Smack库在Android应用中实现登录Openfire服务器、发送文本消息、接收消息以及发送表情功能。 **1. Smack库介绍** ...

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

    **Smack源码详解——基于XMPP的即时通讯客户端** Smack是一款开源的Java库,专为实现基于XMPP(Extensible Messaging and Presence Protocol)的即时通讯应用而设计。XMPP是一种开放标准,广泛用于创建实时通信系统...

    android基于xmpp协议的即时聊天demo

    这些库简化了与XMPP服务器的交互,处理连接、登录、发送和接收消息等操作。 3. **连接管理**:在Android应用中,由于设备可能在网络不稳定或应用被系统杀死后需要重新连接,因此需要实现连接管理和重连策略。这涉及...

    Android XMPP好友列表+聊天

    综上所述,Android平台上实现XMPP好友列表和聊天功能涉及多个层次的技术细节,包括服务器配置、客户端连接、消息收发、用户界面设计以及性能优化。通过熟练掌握这些知识点,开发者可以构建出稳定、高效的即时通讯...

    smack学习笔记

    通过Smack库,开发者可以轻松地实现XMPP协议的功能,包括建立连接、用户登录、发起会话请求以及监听消息和会话创建。Openfire服务器作为后台支持,提供稳定的即时通讯服务。掌握这些基本概念和技术,你就可以开始...

    Android应用源码基于XMPP协议的多帐号聊天.zip

    Smack提供了Message类用于创建聊天消息,开发者可以自定义消息内容,包括文本、图片、音频等。发送消息时,通过XMPPConnection的对象的sendPacket()方法将Message对象发送出去。同时,需要监听服务器的消息,通过...

    smack文档(中文)

    1. **连接与认证**:Smack提供了一套完整的连接管理机制,包括连接到XMPP服务器、身份验证和会话管理。它支持多种认证方式,如PLAIN、DIGEST-MD5、SCRAM-SHA-1等。 2. **实体与资源**:在XMPP中,每个用户都是一个...

    android的XMPP聊天demo

    在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)聊天应用是一个常见的需求,尤其是在构建即时通讯系统时。本文将深入探讨如何使用asmack库来创建一个Android XMPP客户端。 首先,XMPP是一...

    android xmpp chat 聊天程序

    4. **聊天功能**:使用XMPP库,你可以发送和接收文字消息、表情、图片等。这通常涉及创建`Message`对象,设置目的地JID(Jabber ID),然后通过连接发送。同时,也需要监听服务器的响应,以接收并显示来自其他用户的...

    android消息推送 客户端与服务器端(XMPP协议)

    4. **权限控制**:对发送和接收消息的用户进行权限划分,避免恶意操作。 **性能优化** 为了提供良好的用户体验,需要关注性能优化: 1. **心跳机制**:维持持久连接,定期发送心跳包,防止连接超时。 2. **消息...

    Android xmpp 文字、表情、语音、发送图片一起的demo

    **Android XMPP 教程:实现文字、表情、语音及图片发送** XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,常用于构建实时通讯应用,如聊天、语音通话和文件共享等。本教程将围绕一...

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

    理解XMPP的基本概念,如JID( Jabber ID)、资源、流(Stream)、IQ(Info/Query)、Presence(状态)和Message(消息)等,是实现聊天功能的关键。 4. **用户认证与会话管理**:在XMPP中,用户需要通过用户名和...

Global site tag (gtag.js) - Google Analytics