一、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);
- }
相关推荐
xmpp协议,使用smack实现的 博文见http://blog.csdn.net/wklken/article/details/6460075
android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
基于XMPP 协议的Java聊天示例程序,已在本人机子上测试成功!
android openfire xmpp smack即时通讯,包括:聊天发生文字,表情,图片,语音。添加删除好友,消息提醒,群聊,邀请好友进入房间,聊天记录保存等等。界面美观。最后说明:此demo是在网上一个叫EIM企信通的demo基础...
安卓xmpp聊天之文件传输
基于xmpp smackAndroid 做的即时通讯 适用于初学者,
关于Smack编程库,前面我们提到,它是面向Java端的api,主要在PC上使用,利用它我们可以向openfire服务器注册用户,发送消息,并且可以通过监听器获得此用户的应答消息,以及构建聊天室,分组,个人通讯录等等。
关于XMPP协议的smack开源框架源码分析,附带demo,注释,写的不是很好,有待完善,后期会上传
高仿android qq客户端,基于xmpp openfire smack。难得的即时通信学习源码。 介绍链接: http://blog.csdn.net/shimiso/article/details/11225873
XMPP高级编程——使用JavaScript和jQuery,
android openfire xmpp smack即时通讯,包括:聊天发生文字,表情,图片,语音。添加删除好友,消息提醒,群聊,邀请好友进入房间,聊天记录保存等等。界面美观。最后说明:此demo是在网上一个叫EIM企信通的demo基础...
XmppConnectionListerner是xmpp的连接状态的listener,比如断线等XmppMessageInterceptor是发出消息的listener,在此拦截并持久化聊天纪录XmppMessageListener是收到消息的listener,在此拦截并持久化聊天纪录...
Android使用smack连接ejabberd服务器,完成了连接、登录、创建新用户、收发消息的功能
从最基本的层次来说,XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理 现场协议)是一种用来在两个地点之间传递小型的结构化数据段的协议。在此基础上,XMPP 被用来构建大规模即时通信系统、...
android studio 基于XMPP,Openfire,Smack聊天demo 基于openfire3.9.3
基于xmpp openfire smack 的即时通信客户端,高仿qq,难得的学习资源。 资源介绍:http://blog.csdn.net/shimiso/article/details/11225873
本资源是《XMPP高级编程——使用JavaScript和JQuery》一书附带的源码,十分详细,搭载在服务器上可直接运行。如果要用自己搭建的Openfire之类的XMPP服务器,修改也十分简单,是学习Web环境下的XMPP协议开发的好资料...
XMPP+Openfire4.5.1+Smack4.3.4+MySql,支持手机对手机,手机对PC(Spark)的消息收发
smack-im-4.2.2.jar smack-tcp-4.2.2.jar smack-extensions-4.2.2.jar smack-core-4.2.2.jar smack-android-extensions-4.2.2.jar jxmpp-jid-0.6.0.jar jxmpp-core-0.6.0.jar jxmpp-util-cache-0.6.0.jar等jar包