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

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

继续

连接之后,拿到了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);  
    }  
      
 下一篇,主要是用户列表,头像,分组及管理的  


 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值