连接之后,拿到了connection,通过它可以搞定会话

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

通过会话发送消息

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

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

每个connection的chatManager可以设置一个消息监听器,因为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. });

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

  1. 字体表情

在这里实现字体和表情是使用自身开发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. return currentChat.containsKey(userName);
  17. }
  18. //获取对象
  19. public static TelFrame getChatRoom(String userName)
  20. {
  21. return currentChat.get(userName);
  22. }
  23. 下一篇,主要是用户列表,头像,分组及管理的

XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制的更多相关文章

  1. Java ActiveMQ 讲解(二)Spring ActiveMQ整合+注解消息监听

    对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...

  2. spring与activemq(三种消息监听方式)

    1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.Sessio ...

  3. 多线程消息监听容器配置[ 消费者spring-kafka配置文件]

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. C# PC版微信消息监听自动回复

    最近有个微商客户需要搞个 个人微信监听群消息关键字并实现自动回复功能, 因为他有很多群  很多买家咨询的话 一个个回复太麻烦, 客户要求 比如群里有人发 关键字 产品1  则自动回复产品1的相关描述 ...

  5. 简单消息监听容器--SimpleMessageListenerContainer

    这个类非常强大,我们可以对他做很多设置,对于消费者的配置项,这个类都可以满足监听队列(多个队列).自动启动.自动声明功能可以设置事务特性.事务管理器.事务属性.事务容量(并发).是否开启事务.回滚消息 ...

  6. 使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)

    前言: 本文基于jedis 2.9.0.jar.commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis连接池需要依赖commons-pool2包,json ...

  7. 聊天框Demo:DotNetCore+ActiveMQ+Mqttjs 实现前后台消息监听

    网上查了查 ActiveMQ + .net core 的例子很少,自己做一个demo 作为记录,另外FineUI Core基础版要来了,出来后我会用FineUI再做一版,为知识星球的引流... 1.安 ...

  8. Spring整合ActiveMQ及多个Queue消息监听的配置

        消息队列(MQ)越来越火,在java开发的项目也属于比较常见的技术,MQ的相关使用也成java开发人员必备的技能.笔者公司采用的MQ是ActiveMQ,且消息都是用的点对点的模式.本文记录了实 ...

  9. XMPP——Smack[6]离线消息和离线文件的实现

    终篇,三天所学所用,也就这些,如果需要大家要自己去查资料研究研究,功能其实可以很强大的 可惜界面做得不好,一大短处,从大一迄今没整好,主要是个人审美不行,哎 毕业季呀毕业季,明天摆摊卖书,再半月就可能 ...

随机推荐

  1. VC编程技巧:IE控件的高级用法

    一.如何显示内存中的 HTML 网页 二.屏蔽 IE 控件的上下文菜单 三.扩展 HTML 脚本中的 external 对象 四.显示 HTML 样式的对话窗 五.执行 HTML 脚本 http:// ...

  2. Microsoft.Data.ConnectionUI.DataConnectionDialog

    MicrosoftVisualStudio里面的资源之数据库连接配置 这个功能的实现主要是用了Microsoft.Data.ConnectionUI.dll和Microsoft.Data.Connec ...

  3. BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1031 长度为n的字符串形成环,枚举开头位置,得到n个长度为n的串,将这些串排序,然后按照顺序输 ...

  4. 对redis客户端jedis2.8.0的进一步封装

    jedis2.8.0的进一步封装: 1.序列化存储对象 2.结合spring,创建redis连接池 3.提供了基础的单个实体操作,有序list操作和一对多关系list的操作,对list提供了分页的封装 ...

  5. dubbo + zookeeper 环境搭建

    一.zookeeper windows部署 1.下载安装 到官网下载解压版后解压至F:\server\zookeeper-3.4.8,剩下为文件配置工作: 2.本地伪集群 1) 在F:\server\ ...

  6. jquery 图片上传本地预览V1.2

    基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 代码进行小小的压缩 如果看源码 自己解压就行了 版本已升级  修复jquery版本问题  支持任意jqu ...

  7. DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

    背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...

  8. ubuntu设置ip和dns

      装完ubuntu 第一件事情就是连上网,换个源,进行更新操作,但前提条件是要配好ip和dns.   下面把自己配置的过程记录下来,权且当作一份备份,以便不时之需.   一.配置ip      ub ...

  9. C++ 学习资料搜寻与学习(第一期)(未完待续)

    一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“S ...

  10. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.7

    Prove that for any vectors $$\bex u_1,\cdots,u_k,\quad v_1,\cdots,v_k, \eex$$ we have $$\bex |\det(\ ...