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来做消息推送了,这里就没有再过多仔细研究。

优质内容筛选与推荐>>
1、Django 对接elasticsearch实现全文检索
2、Go语言入门(二)---内建变量类型
3、Llinux常用命令
4、Djago - Form组件动态绑定数据
5、复现梯度爆炸与梯度消失


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn