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

来源:互联网 发布:大数据产生的背影 题 编辑:程序博客网 时间:2024/04/25 20:46

上一篇是连接,登陆登出和账户管理

继续

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

1. 建立一个会话

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

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

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

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


 

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

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

[java] view plaincopyprint?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. 聊天窗口控制

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

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

思想:单例类,持有一个

//现有的聊天窗口

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

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

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

若是关闭窗口,注销之

[java] view plaincopyprint?//注册聊天室       public static void registerChat(String userName,TelFrame chatroom)      {          //System.out.println("注册:"+userName);           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);      }         下一篇,主要是用户列表,头像,分组及管理的  


 

 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2个月宝宝厌食怎么办 宝宝吃母乳不长体重怎么办 9个月宝宝不长牙怎么办 3个月宝宝过胖怎么办 宝宝长的很慢怎么办 想一个月瘦20斤怎么办 山药弄胳膊上痒怎么办 手碰山药很痒怎么办 手摸了山药很痒怎么办 手切了山药很痒怎么办 山药弄的身上痒怎么办 疣迪去除疣体怎么办 尖锐湿庞出血了怎么办 尿道口周围烂了怎么办 尖锐湿庞复发了怎么办 宝宝脸上长湿疹怎么办如何治疗 孕妇得尖锐湿庞怎么办 痘痘留下的小坑怎么办 花洒固定座坏了怎么办 脚上起水泡烂了怎么办 月经期吃了芒果怎么办 月经量少又黑怎么办 来月经黑色的血怎么办 月经来的是黑色怎么办 来月经有血块是怎么办 月经又少又黑怎么办 来月经发黑又少怎么办 月经血发黑量少怎么办 做人流后肚子胀怎么办 怀孕见红了肚子不痛怎么办 月经来是黑色的怎么办 怀孕了长了痔疮怎么办 怀孕了有外痔疮怎么办 孕妇长痔疮很痛怎么办 孕9个月尿路感染怎么办 旁边有人尿不出来怎么办 外阴破皮了应该怎么办 脸上长脂肪粒怎么办怎么能消除 挤黑头留下的坑怎么办 长痘留下的坑怎么办 鼻子上留下黑印怎么办