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


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

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

    通过会话发送消息

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

    1. public static void sendMessage(Chat chat,String message) throws XMPPException {  
    2.         chat.sendMessage(message);  
    3.     }  
    4.       
    5.     public static void sendMessage(Chat chat,Message message) throws XMPPException {  
    6.         chat.sendMessage(message);  
    7.     }  
    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.             }  
    12.         });  

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

    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.           
    17.         return currentChat.containsKey(userName);  
    18.     }  
    19.     //获取对象  
    20.     public static TelFrame getChatRoom(String userName)  
    21.     {  
    22.         return currentChat.get(userName);  
    23.     }  
    24.       
    25.  下一篇,主要是用户列表,头像,分组及管理的  
  • 相关阅读:
    集训队作业2018人类的本质
    推式子小技巧
    [Codeforces671D]Roads in Yusland
    线性规划的对偶问题
    数学虐哭空巢老人记
    Voronoi图与Delaunay三角剖分
    [ZJOI2018]保镖
    [SPOJ2939]Qtree5
    数据结构虐哭空巢老人记
    [CTSC2006]歌唱王国
  • 原文地址:https://www.cnblogs.com/jiayonghua/p/3765904.html
Copyright © 2020-2023  润新知