zoukankan      html  css  js  c++  java
  • openfire消息发送

    找了一些demo,做了一些示例,演示了基于xmpp协议的openfire的客户端之间消息的发送。

    代码需要两个包,smack.jar ,smackx.jar。

    第一个代码,只是点对点发送消息的,不涉及广播。

    package com.test;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    import org.jivesoftware.smack.Chat;
    import org.jivesoftware.smack.MessageListener;
    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.packet.Message;
    
    public class ChatTest {
    
        public static void main(String[] args) throws XMPPException {
            // TODO Auto-generated method stub
            XMPPConnection.DEBUG_ENABLED=true;
            XMPPConnection connection=new XMPPConnection("127.0.0.1");
            connection.connect();
            connection.login("zhang", "12345");
            Chat chat=connection.getChatManager().createChat("liu@127.0.0.1", new MessageListener() {
                
                @Override
                public void processMessage(Chat chat, Message message) {
                    // TODO Auto-generated method stub
                    System.out.println(message.getFrom()+" "+new java.util.Date().toString()+" say:"+message.getBody());
                }
            });
            BufferedReader cmdl=new BufferedReader(new InputStreamReader(System.in));
            for (; ; ) {
                try {
                    String cmd=cmdl.readLine();
                    if ("!q".equalsIgnoreCase(cmd)) {
                        break;
                    }
                    chat.sendMessage(cmd);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
            }
            connection.disconnect();
            System.exit(0);
        }
    }

    login方法里面的参数是当前要登录的账户,createchat方法中的,是聊天的对方的账号。运行时,liu在spark客户端登录,在本机的console就可以和liu交流了。

    第二种涉及到广播,其实就一个方法。要使用广播功能,需要在openfire的服务器上安装一个广播的插件,不然是无法发送广播的。

    package com.test;
    
    import java.util.Collection;
    import java.util.Scanner;
    
    import org.jivesoftware.smack.Chat;
    import org.jivesoftware.smack.ChatManager;
    import org.jivesoftware.smack.MessageListener;
    import org.jivesoftware.smack.RosterEntry;
    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.packet.Message;
    
    public class IMTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            XMPPConnection.DEBUG_ENABLED=true;
            XMPPConnection connection=null;
            try {
                IMTest test=new IMTest();
                connection=test.getConnection();
                test.doLogin(connection);
                test.getRoster(connection);
                //test.sendMessage(connection);
                test.sendPacket(connection);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                connection.disconnect();
            }
        }
    
        private XMPPConnection getConnection() throws XMPPException{
            XMPPConnection con=new XMPPConnection("127.0.0.1");
            con.connect();
            return con;
        }
        
        private void doLogin(XMPPConnection connection) throws XMPPException{
            connection.login("admin", "12345");
            System.out.println(connection.getUser()+" has logined");
        }
        
        private Collection<RosterEntry> getRoster(XMPPConnection connection){
            Collection<RosterEntry> roster=connection.getRoster().getEntries();
            for(RosterEntry entry:roster){
                System.out.println("name :"+entry.getName()+",jid:"+entry.getUser());
            }
            return roster;
        }
        
        private void sendMessage(XMPPConnection connection) throws XMPPException{
            ChatManager chatManager=connection.getChatManager();
            Chat chat=chatManager.createChat("liu@127.0.0.1", new MessageListener() {
                //获取对方消息
                @Override
                public void processMessage(Chat chat, Message message) {
                    // TODO Auto-generated method stub
                    System.out.println(message.getFrom()+" say: "+message.getBody());
                }
            });
            //发送消息
            Scanner inputScanner=new Scanner(System.in);
            while(true){
                String messageString=inputScanner.nextLine();
                System.out.println(connection.getUser()+" say:"+messageString);
                chat.sendMessage(messageString);
            }
        }
        
        private void sendPacket(XMPPConnection connection){
            Message message=new Message();
            message.setTo("all@broadcast.127.0.0.1");
            message.setSubject("广播");
            message.setBody("推送信息");
            message.setType(Message.Type.normal);//离线支持
            connection.sendPacket(message);
            connection.disconnect();
        }
    }

    发送广播的时候,setTo里面,@后面有broadcast标识,这个不能少。

    不过目前广播消息,有时候会出现消息重复发送的情况。目前是打算采用上篇文章中所说的androidpn来做消息推送了,这里就没有再过多仔细研究。

  • 相关阅读:
    企业远程视频会议云服务EasyRTC-SFU版本支持 https 功能设计逻辑
    企业视频远程办公会议通话系统EasyRTC在Windows2012部署运行出现“计算机中丢失VCRUNTIME140.dll”如何解决?
    IP摄像头RTSP协议客户端EasyNVR视频平台提示加密机授权异常原因分析
    【方案搭建】多个工程如何做监控视频的集中管控?EasyNVR视频平台打造智慧工厂新方向
    IP摄像头RTSP协议客户端EasyNVR视频平台如何调用主码流和子码流?
    如何通过私有化部署自建一套基于RTSP协议的视频流媒体边缘计算系统EasyNVR视频平台来实现网络摄像头的实时直播回看?
    IP网络摄像机RTMP协议互联网直播/点播平台EasyDSS直播间录像录制机制说明
    视频上云网关/网络穿透设备EasyNTS下载表格时后端打印报错信息,但是又不影响下载的问题如何解决
    视频高速上云网关EasyNTS组网服务2.1.1新版本无法兼容低版数据库问题解析
    视频上云/网络穿透/网络映射服务EasyNTS前端组织添加页面出现Vue冲突怎么解决?
  • 原文地址:https://www.cnblogs.com/juepei/p/3898610.html
Copyright © 2011-2022 走看看