一、XMPP
XMPP : The Extensible Messaging and Presence Protocol
中文全称:可扩展通讯和表示协议
简介:
可扩展通讯和表示协议 (XMPP) 可用于服务类实时通讯、表示和需求 - 响应服务中的 XML 数据元流式传输。XMPP 以 Jabber 协议为基础,而 Jabber 是即时通讯中常用的开放式协议。
二、Smack
Smack是一个开源,易于使用的XMPP(jabber)客户端类库。
Smack API, 是一个 Java 的XMPP Client Library,也是由Jive Software开发。 优点:编程简单。 缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,1台机器只能模拟有限(数千个)客户.
smack是一个用 java 写的XMPP客户端代码库, 是 spark 的核心.
二、连接及断开
基本方法
XMPPConnection connection = new XMPPConnection("gmail.com");
connection.connect();
实现的方法
- public static XMPPConnection getConnection(String domain) throws XMPPException {
-
- XMPPConnection connection = new XMPPConnection(domain);
- connection.connect();
- return connection;
- }
-
-
- public static XMPPConnection getConnection(String domain,int port) throws XMPPException {
- ConnectionConfiguration config = new ConnectionConfiguration(domain,port);
- XMPPConnection connection = new XMPPConnection(config);
- connection.connect();
- return connection;
- }
断开
connection.disconnect();
四、登陆
connection.login("javatest2011@gmail.com", "*****");
五、账户操作
可以对账户进行基本操作,包括注册,注销,修改密码
-
-
-
-
-
-
-
- public static boolean createAccount(XMPPConnection connection,String regUserName,String regUserPwd)
- {
- try {
- connection.getAccountManager().createAccount(regUserName, regUserPwd);
- return true;
- } catch (Exception e) {
- return false;
- }
- }
-
-
-
-
-
-
- public static boolean deleteAccount(XMPPConnection connection)
- {
- try {
- connection.getAccountManager().deleteAccount();
-
- return true;
- } catch (Exception e) {
- return false;
- }
- }
-
-
-
-
-
-
- public static boolean changePassword(XMPPConnection connection,String pwd)
- {
- try {
- connection.getAccountManager().changePassword(pwd);
-
- return true;
- } catch (Exception e) {
- return false;
- }
- }
XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制
拿到了connection,通过它可以搞定会话
1. 建立一个会话
- MessageListener msgListener
- = new MessageListener()
- {
- public void processMessage(Chat chat, Message message)
- {
-
- if (message != null && message.getBody() != null)
- {
- System.out.println("收到消息:" + message.getBody());
-
- }
-
- }
- };
- Chat chat = Client.getConnection().getChatManager()
- .createChat(userName, msgListener);
通过会话发送消息
两个方法,一个直接发送一条文本,一个发送一个Message对象,可包含一些信息,一般使用后者,因为需要包装字体等信息
- public static void sendMessage(Chat chat,String message) throws XMPPException {
- chat.sendMessage(message);
- }
-
- public static void sendMessage(Chat chat,Message message) throws XMPPException {
- chat.sendMessage(message);
- }
2. 消息监听
每个connection的chatManager可以设置一个消息监听器,因为IM必须实现他人对你发起会话也会弹出窗口,即自己可以主动发起会话,也可以接收他人发起的会话
- ChatManager manager = Client.getConnection().getChatManager();
- manager.addChatListener(new ChatManagerListener() {
- public void chatCreated(Chat chat, boolean arg1) {
- chat.addMessageListener(new MessageListener() {
- public void processMessage(Chat arg0, Message message) {
-
-
-
- }
- });
- }
- });
其实窗口的管理是使用线程的,来一个新的会话,起线程
3. 字体表情
在这里实现字体和表情是使用自身开发IM之间的实现。
字体实现思想:
在发送消息的同时,将字体内容作为附加信息发送,接收方接收到根据字体信息进行处理后显示
实现:使用Message对消息进行封装
- Message msg = new Message();
- msg.setProperty("size", size);
- msg.setProperty("kind", kind);
- msg.setProperty("bold", bold);
- msg.setProperty("italic", italic);
- msg.setProperty("underline", underline);
- msg.setProperty("color", color);
- msg.setBody(getSendInfo());
- chat.sendMessage(msg);
接收方先获取设置信息后展示
展示的控件: JTextPane receiveText = new JTextPane();
- Style style = receiveText.addStyle("font", null);
- StyleConstants.setFontSize(style, size);
- StyleConstants.setFontFamily(style, kind);
- StyleConstants.setBold(style, bold);
- StyleConstants.setItalic(style, italic);
- StyleConstants.setUnderline(style, underline);
- StyleConstants.setForeground(style, color);
表情:
实现机制是客户端本身存有一套表情图片,在选中时,将表情编号加入到消息中,实际发送出去的只是文本,拿到后解析字符串,将编号转为具体表情展示
具体就不写了
1. 聊天窗口控制
所谓控制,主要是控制唯一性
无论是你发起一个会话开启一个窗口,还是对方给你发送会话开启,你与对方之间有且仅有一个窗口,之后任何消息都在这个窗口中处理
思想:单例类,持有一个
//现有的聊天窗口
public static TreeMap<String,TelFrame> currentChat = new TreeMap<String,TelFrame>();
其实应该用concurrentHashMap可能会更好,不顾我这边分派的主线程只有一个,不涉及多个线程并发的问题,所以用了Treemap,汗一个,貌似应该hashmap,当时考虑不同
然后,在接收消息的时候根据发消息的用户,判定窗口是否存在,存在,转发消息到该窗口,不存在,建立新的窗口
若是关闭窗口,注销之
-
- public static void registerChat(String userName,TelFrame chatroom)
- {
-
- currentChat.put(userName, chatroom);
- }
-
- public static void removeChat(String userName)
- {
- System.out.println("用户注销聊天室:"+userName);
- currentChat.remove(userName);
- }
-
- public static boolean isChatExist(String userName)
- {
-
- return currentChat.containsKey(userName);
- }
-
- public static TelFrame getChatRoom(String userName)
- {
- return currentChat.get(userName);
- }
相关推荐
综上所述,Smack 4.1.9在Android上的应用涉及到XMPP协议的基础知识,包括连接、身份验证、会话管理、消息传递和文件传输等功能。开发者可以借助这些工具,结合“releasedocs”和“javadoc”的帮助,构建出高效、可靠...
总结,使用Android Smack库开发即时通讯应用,开发者需要理解XMPP协议的基础概念,掌握Smack的初始化、连接、注册登录、消息发送与接收以及监听机制。通过实践和不断优化,可以构建出高效、稳定的IM系统。对于初学者...
Smack 是一个强大的开源 Java 库,专门用于处理 XMPP(可扩展消息处理和存在协议)通信。XMPP 是一种实时通信协议,广泛应用于即时消息、VoIP 和在线游戏等场景。Openfire 是一个流行的 XMPP 服务器,而 Smack 则是...
1. **XMPP协议**:XMPP是一种开放标准的实时通信协议,它基于XML流传输,广泛应用于即时消息、在线状态跟踪和文件传输。XMPP的核心设计使其能够处理大量并发连接,支持多用户聊天、群组功能和跨域通信,因此非常适合...
Smack库包含连接管理、会话建立、消息发送和接收等功能,大大简化了开发过程。在集成Smack库时,确保下载对应的Android版本,并将其添加到项目的build.gradle文件中。 接下来,我们需要配置Android Studio项目,...
《安卓Android源码——基于XMPP协议的多帐号聊天》 在移动通信领域,实时通讯功能已经成为各种应用程序不可或缺的一部分。Android平台提供了丰富的API和工具,使得开发者能够构建复杂且高效的应用,其中包括聊天...
在源码中,"XMPPClient"可能是一个核心类,负责与XMPP服务器建立连接、发送和接收消息。这个类通常会包含以下几个关键部分: 1. **连接管理**:初始化XMPP连接,包括设置服务器地址、端口、用户名和密码。使用...
XMPP是一种基于XML的开放标准,用于即时消息传递和在线状态跟踪,它允许用户进行实时通信,适用于多对多的交流场景。本篇文章将深入探讨如何利用XMPP协议,结合OpenFire服务器以及Smack类库,在Android项目中构建一...
本教程将基于标题"Android Smack 接收 发送消息 表情发送",以及描述中的内容,详细讲解如何利用Smack库在Android应用中实现登录Openfire服务器、发送文本消息、接收消息以及发送表情功能。 **1. Smack库介绍** ...
**Smack源码详解——基于XMPP的即时通讯客户端** Smack是一款开源的Java库,专为实现基于XMPP(Extensible Messaging and Presence Protocol)的即时通讯应用而设计。XMPP是一种开放标准,广泛用于创建实时通信系统...
这些库简化了与XMPP服务器的交互,处理连接、登录、发送和接收消息等操作。 3. **连接管理**:在Android应用中,由于设备可能在网络不稳定或应用被系统杀死后需要重新连接,因此需要实现连接管理和重连策略。这涉及...
综上所述,Android平台上实现XMPP好友列表和聊天功能涉及多个层次的技术细节,包括服务器配置、客户端连接、消息收发、用户界面设计以及性能优化。通过熟练掌握这些知识点,开发者可以构建出稳定、高效的即时通讯...
通过Smack库,开发者可以轻松地实现XMPP协议的功能,包括建立连接、用户登录、发起会话请求以及监听消息和会话创建。Openfire服务器作为后台支持,提供稳定的即时通讯服务。掌握这些基本概念和技术,你就可以开始...
Smack提供了Message类用于创建聊天消息,开发者可以自定义消息内容,包括文本、图片、音频等。发送消息时,通过XMPPConnection的对象的sendPacket()方法将Message对象发送出去。同时,需要监听服务器的消息,通过...
1. **连接与认证**:Smack提供了一套完整的连接管理机制,包括连接到XMPP服务器、身份验证和会话管理。它支持多种认证方式,如PLAIN、DIGEST-MD5、SCRAM-SHA-1等。 2. **实体与资源**:在XMPP中,每个用户都是一个...
在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)聊天应用是一个常见的需求,尤其是在构建即时通讯系统时。本文将深入探讨如何使用asmack库来创建一个Android XMPP客户端。 首先,XMPP是一...
4. **聊天功能**:使用XMPP库,你可以发送和接收文字消息、表情、图片等。这通常涉及创建`Message`对象,设置目的地JID(Jabber ID),然后通过连接发送。同时,也需要监听服务器的响应,以接收并显示来自其他用户的...
4. **权限控制**:对发送和接收消息的用户进行权限划分,避免恶意操作。 **性能优化** 为了提供良好的用户体验,需要关注性能优化: 1. **心跳机制**:维持持久连接,定期发送心跳包,防止连接超时。 2. **消息...
**Android XMPP 教程:实现文字、表情、语音及图片发送** XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,常用于构建实时通讯应用,如聊天、语音通话和文件共享等。本教程将围绕一...
理解XMPP的基本概念,如JID( Jabber ID)、资源、流(Stream)、IQ(Info/Query)、Presence(状态)和Message(消息)等,是实现聊天功能的关键。 4. **用户认证与会话管理**:在XMPP中,用户需要通过用户名和...