上一篇是连接,登陆登出和账户管理
继续
连接之后,拿到了connection,通过它可以搞定会话
1. 建立一个会话
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对象,可包含一些信息,一般使用后者,因为需要包装字体等信息
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必须实现他人对你发起会话也会弹出窗口,即自己可以主动发起会话,也可以接收他人发起的会话
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对消息进行封装
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);
接收方先获取设置信息后展示
展示的控件: JTextPane receiveText = new JTextPane();
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. 聊天窗口控制
所谓控制,主要是控制唯一性
无论是你发起一个会话开启一个窗口,还是对方给你发送会话开启,你与对方之间有且仅有一个窗口,之后任何消息都在这个窗口中处理
思想:单例类,持有一个
//现有的聊天窗口
public static TreeMap<String,TelFrame> currentChat = new TreeMap<String,TelFrame>();
其实应该用concurrentHashMap可能会更好,不顾我这边分派的主线程只有一个,不涉及多个线程并发的问题,所以用了Treemap,汗一个,貌似应该hashmap,当时考虑不同
然后,在接收消息的时候根据发消息的用户,判定窗口是否存在,存在,转发消息到该窗口,不存在,建立新的窗口
若是关闭窗口,注销之
//注册聊天室 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); } 下一篇,主要是用户列表,头像,分组及管理的