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

  1. 建立一个会话
[java] view plaincopyprint?
  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对象,可包含一些信息,一般使用后者,因为需要包装字体等信息

[java] view plaincopyprint?
  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必须实现他人对你发起会话也会弹出窗口,即自己可以主动发起会话,也可以接收他人发起的会话

[java] view plaincopyprint?
  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对消息进行封装

[java] view plaincopyprint?
  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();

[java] view plaincopyprint?
  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,当时考虑不同

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

若是关闭窗口,注销之

[java] view plaincopyprint?
  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. 下一篇,主要是用户列表,头像,分组及管理的

转载于:https://www.cnblogs.com/jiayonghua/p/3765904.html

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

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

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://ww ...

  2. RabbitMQ消息监听(多种模式-fanout/topic)

    1.rabbitmq消息监听,兼容多种模式的消息,fanout/topic等模式 MQ消息配置监听: package com.test.ddyin.conf;import java.util.Hash ...

  3. 压枪源码,移动鼠标源码,监听鼠标源码,控制鼠标移动源码,控制鼠标移动脚本

    压枪源码,移动鼠标源码,监听鼠标源码,控制鼠标移动源码,控制鼠标移动脚本 加了很多注释了,肯定能看懂,双开火键,左键正常,侧键直接压开 先ahk官网下载安装后就能直接运行这个ahk文件了 一开始尝试p ...

  4. activemq 开启监听_ActiveMQ 消息监听 MessageListener 的使用

    刚学 ActiveMQ, 最开始搭建环境的时候引入的jar 包,几个核心的jar jms.jar, httpcore.jar , httpclient.jar, activemq-all.jar 准备 ...

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

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

  6. 使用cdn来加速字体文件在前端的加载速度,并监听字体是否加载完成

    最近在个人网站butterpig中实现了个性印章的在线设计功能,里面目前一共实现了有八九种个性印章的样式,并且还有六七种网络开源商用的字体类型.具体效果可以访问:个性印章在线设计查看. 印章的设计,其 ...

  7. itchat库实现简单的微信消息监听

    itchat itchat是一个开源的微信个人号接口,作为python的一个轻量的第三方库,使用较少的代码就能实现微信消息的收发以及监测. 安装 由于2017年后,新注册的微信基本登录不了网页版,所以 ...

  8. C# 开启HTTP监听服务与线程数量控制

    如何开IP和端口的HTTP监听这里就是按照实现这种方式来加以说明,另外线程不要再循环里面不停的new Thread()这样很耗性能. 开启HTTP服务监听 /// <summary>/// ...

  9. 浅谈javascript的事件监听——音乐播放器的控制

    javascript的事件 javascript是一门基于事件驱动的语言,当html页面中的元素触发一些动作时,可以执行相关的js代码. 1.常见事件 浏览器窗体事件 事件名 描述 onload 当窗 ...

最新文章

  1. 计算机管理信息系统大作业,管理信息系统期末大作业
  2. 网络对抗技术 实验报告 三
  3. 31.4. Open Source Development for the D Programming Language
  4. [Android] 给图像添加相框、圆形圆角显示图片、图像合成知识
  5. sh: 0: getcwd() failed: No such file or directory解决
  6. javascript 学习笔记三 之 变量
  7. 防止重复提交js jquery ajax
  8. 12条守则:让你成功创业当老板
  9. Qt中文本编辑器实现语法高亮功能(Qscitinlla)
  10. android edittext最多输入,android 中如何限制 EditText 最大输入字符数
  11. C++中sizeof和strlen
  12. Docker下ETCD集群搭建
  13. 音视频处理入门基础知识
  14. 计算机四级c语言试题及答案,计算机等级考试试题及答案
  15. JAVA中关于除数为0
  16. 台式计算机怎么查看网卡号,怎么查看台式机电脑有没有无线网卡?
  17. SWF游戏软件逆向基础知识1
  18. Android使用svg格式图片,并改变图片颜色
  19. 哇,你也想自由职业啊
  20. 通俗易懂解释Docker是什么

热门文章

  1. Codeforces1486 C1.Guessing the Greatest (easy version)(交互题+二分)
  2. 同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结
  3. Java——为什么要有接口?
  4. C#简单实现控制台2048
  5. 想在微信上使用chatGPT?小程序?公众号?企业微信,最终还是选择了企业微信版本的chatgpt
  6. MPLS LDP的原理与配置
  7. 微信开通检测平台应如何选择?
  8. 关于PDF文件无法打印的问题的解决办法
  9. ssm基于微信小程序的游泳馆管理系统+uinapp+java+计算机毕业设计
  10. Pohlig-Hellman算法解决DLP问题