openfire的安装和java实现其聊天

来源:互联网 发布:淘宝如何进入卖家中心 编辑:程序博客网 时间:2024/05/17 09:13

首先需要安装jdk

http://blog.csdn.net/warm_start/article/details/53515759

下载openfire

http://www.igniterealtime.org/downloads/index.jsp#openfire

我用的是

openfire_4_0_4.tar.gz

tar -zvxf openfire_4_0_4.tar.gz

cd openfire/bin

./openfire start 启动

登录到你安装服务器的ip:9090默认端口号为9090

如:192.168.1.252:9090

设置的话可以看一篇文章

http://favccxx.blog.51cto.com/2890523/1618995/

下面是您的数据库和 JDBC 驱动程序的属性列表。

数据库连接信息数据库和版本:MySQL 5.5.49-logJDBC 驱动程序:MySQL Connector JavaJDBC 驱动程序版本:mysql-connector-java-5.1.30 ( Revision: alexander.soklakov@oracle.com-20140310090514-8xt1yoht5ksg2e7c )DB 连接 URL:jdbc:mysql://localhost:3306/of?rewriteBatchedStatements=true0DB 用户:root@localhost事务支持:Yes事务隔离级别:TRANSACTION_REPEATABLE_READ支持多连接
一次打开:Yes在只读方式中:No


连接池信息House Keeping Interval:30 秒最大连接生命周期:86400 秒最小连接数:5最大连接数:25连接测试sql:select 1在使用前测试连接:No在使用后测试连接:No连接数:0 (活跃), 5 (可用的), 25 (最大)
 连接成功:101连接被拒绝:48连接详细信息:编号创建时间最后使用线程6119:45:1320:01:24Jetty-QTP-AdminConsole-446019:45:1319:57:32TaskEngine-pool-65919:45:1319:52:32TaskEngine-pool-35819:45:1319:50:01Jetty-QTP-AdminConsole-455719:45:1219:50:01Jetty-QTP-AdminConsole-45


开始写java代码进行聊天

注意:先配置完openfire,开启服务

登录ip:9090进后台可以先创建两个用户,user1和user2密码都为123456


smack.jar
smackx.jar

需要这两个jar包

下载地点

http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_2_2.zip

开一个项目把jar包放入lib里面


下面是做演示作用的,完全可以用一个公共方法进行封装,主要是为了做区分,和模拟两个文件中的人进行聊天

创建文件1,:openfire2Action

import org.jivesoftware.smack.*;import org.jivesoftware.smack.packet.Message;import java.util.Scanner;public class openFire3Action {    private Connection connection;    private ConnectionConfiguration config;    /** openfire服务器address */    private final static String server = "wen";        public void init() {        try {            //config = new ConnectionConfiguration(server,5222);            ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.252", 5222, server);            /*config.setCompressionEnabled(true);            *//** 是否启用安全验证 *//*            config.setSASLAuthenticationEnabled(true);            *//** 是否启用调试 *//*            config.setDebuggerEnabled(false);*/            config.setReconnectionAllowed(false);            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);            config.setSendPresence(true);            /** 创建connection链接 */            connection = new XMPPConnection(config);            /** 建立连接 */            connection.connect();        } catch (XMPPException e) {            e.printStackTrace();        }    }    public void destory() {        if (connection != null) {            connection.disconnect();            connection = null;        }    }    public static void main(String[] args) {        openFire3Action smack = new openFire3Action();        FromUser fromUser = new FromUser();        fromUser.setUsername("user2");        fromUser.setPassword("123456");        smack.sendMsg(fromUser, "user1","");        smack.destory();    }    public void sendMsg(FromUser fromUser, String toUserName, String msg) {        init();        try {            connection.login(fromUser.getUsername(), fromUser.getPassword());        } catch (Exception e) {            e.printStackTrace();        }        ChatManager chatmanager = connection.getChatManager();        Chat newChat = chatmanager.createChat(toUserName + "@" + server, new MessageListener() {            public void processMessage(Chat chat, Message message) {                if (message.getBody() != null) {                    System.out.println("name 【"                            + message.getFrom() + "】 地瓜: "                            + message.getBody());                }            }        });        Scanner input = new Scanner(System.in);        while (true) {            String message = input.nextLine();            try {                newChat.sendMessage(message);            } catch (XMPPException e) {                e.printStackTrace();            }        }        /*try {            destory();        }catch (Exception e){            e.printStackTrace();        }*/    }}
创建文件二:openFire3Action

import org.jivesoftware.smack.*;import org.jivesoftware.smack.packet.Message;import java.util.Scanner;public class openFire3Action {    private Connection connection;    private ConnectionConfiguration config;    /** openfire服务器address */    private final static String server = "wen";    public void init() {        try {            //config = new ConnectionConfiguration(server,5222);            ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.252", 5222, server);            /*config.setCompressionEnabled(true);            *//** 是否启用安全验证 *//*            config.setSASLAuthenticationEnabled(true);            *//** 是否启用调试 *//*            config.setDebuggerEnabled(false);*/            config.setReconnectionAllowed(false);            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);            config.setSendPresence(true);            /** 创建connection链接 */            connection = new XMPPConnection(config);            /** 建立连接 */            connection.connect();        } catch (XMPPException e) {            e.printStackTrace();        }    }    public void destory() {        if (connection != null) {            connection.disconnect();            connection = null;        }    }    public static void main(String[] args) {        openFire3Action smack = new openFire3Action();        FromUser fromUser = new FromUser();        fromUser.setUsername("user2");        fromUser.setPassword("123456");        smack.sendMsg(fromUser, "user1","");        smack.destory();    }    public void sendMsg(FromUser fromUser, String toUserName, String msg) {        init();        try {            connection.login(fromUser.getUsername(), fromUser.getPassword());        } catch (Exception e) {            e.printStackTrace();        }        ChatManager chatmanager = connection.getChatManager();        Chat newChat = chatmanager.createChat(toUserName + "@" + server, new MessageListener() {            public void processMessage(Chat chat, Message message) {                if (message.getBody() != null) {                    System.out.println("name 【"                            + message.getFrom() + "】 地瓜: "                            + message.getBody());                }            }        });        Scanner input = new Scanner(System.in);        while (true) {            String message = input.nextLine();            try {                newChat.sendMessage(message);            } catch (XMPPException e) {                e.printStackTrace();            }        }        /*try {            destory();        }catch (Exception e){            e.printStackTrace();        }*/    }}

执行效果




注意:下面是遇到的问题:

private final static String server = "wen";
其中,这个是openfire服务器的名称,

还有:这个是本地openfire连接的方式,用这种方式测试就可以了

ConnectionConfiguration  config = new ConnectionConfiguration(server,5222); config.setCompressionEnabled(true); /** 是否启用安全验证 */ config.setSASLAuthenticationEnabled(true); /** 是否启用调试 */ config.setDebuggerEnabled(false);



下面这种事openfire服务器安装在别的机器上:如果想要在公网上进行聊天,需要把openfire安装在有公网固定ip的机器上。


192.168.1.252是公网的ip,或者是本地局域网,中安装openfire服务的那台机器的ip,5222是端口,默认端口,server是openfire服务器名称

 ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.252", 5222, server);            config.setReconnectionAllowed(false);            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);            config.setSendPresence(true);


报错提示:
javax.net.ssl.SSLException: Received fatal alert: internal_error
这个错误我猜测是因为,你还没连接上openfire服务器,就登录导致的。
stream:error (conflict)
这个错误是多次登录用户导致的。
还有一个是server什么504的错误,是因为,连接不上

未完待续


继续

那么怎么添加openfire用户账号和密码呢?

代码如下,继续引用上面的文件

import net.sf.json.JSONObject;import org.jivesoftware.smack.*;import org.jivesoftware.smack.packet.Message;import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class openFire3Action {    private Connection connection;    private ConnectionConfiguration config;    /** openfire服务器address */    private final static String server = "wen";    /*public void init() {        try {            //config = new ConnectionConfiguration(server,5222);            ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.252", 5222, server);            *//*config.setCompressionEnabled(true);            *//**//** 是否启用安全验证 *//**//*            config.setSASLAuthenticationEnabled(true);            *//**//** 是否启用调试 *//**//*            config.setDebuggerEnabled(false);*//*            config.setReconnectionAllowed(false);            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);            config.setSendPresence(true);            *//** 创建connection链接 *//*            connection = new XMPPConnection(config);            *//** 建立连接 *//*            connection.connect();        } catch (XMPPException e) {            e.printStackTrace();        }    }*/    public XMPPConnection getXMPPConnection() {        try {            ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.252", 5222, server);            config.setReconnectionAllowed(false);            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);            config.setSendPresence(true);            XMPPConnection connection = new XMPPConnection(config);            connection.connect();            return connection;        } catch (XMPPException e) {            e.printStackTrace();        }        return null;    }    public void destory() {        if (connection != null) {            connection.disconnect();            connection = null;        }    }    public static void main(String[] args) {        openFire3Action smack = new openFire3Action();        /*FromUser fromUser = new FromUser();        fromUser.setUsername("user2");        fromUser.setPassword("123456");        smack.sendMsg(fromUser, "user1","");*/        //创建用户的信息        Map<String,String> map = new HashMap<String, String>();        map.put("email","");        map.put("name", "name");        smack.register("user3",map,smack.getXMPPConnection());        smack.destory();    }    /**     * 注册账号     * username 是账号名     * map是邮箱,name,还有其他信息     * XMPPConnection 是连接通道     */    public void register(String username, Map<String, String> attrMap,XMPPConnection XMPPConnection) {        try {            if (username != null && !username.isEmpty()) {                //统一默认密码                if(XMPPConnection!=null) {                    //"1"为账号密码,默认都为                    XMPPConnection.getAccountManager().createAccount(username, "123456", attrMap);                }            }        } catch (XMPPException e) {            e.printStackTrace();        }    }    /*public void sendMsg(FromUser fromUser, String toUserName, String msg) {        init();        try {            connection.login(fromUser.getUsername(), fromUser.getPassword());        } catch (Exception e) {            e.printStackTrace();        }        ChatManager chatmanager = connection.getChatManager();        Chat newChat = chatmanager.createChat(toUserName + "@" + server, new MessageListener() {            public void processMessage(Chat chat, Message message) {                if (message.getBody() != null) {                    System.out.println("name 【"                            + message.getFrom() + "】 地瓜: "                            + message.getBody());                }            }        });        Scanner input = new Scanner(System.in);        while (true) {            String message = input.nextLine();            try {                newChat.sendMessage(message);            } catch (XMPPException e) {                e.printStackTrace();            }        }    }*/}
效果如下创建了用户3



如多人聊天,该怎么办呢?则需创建会议室,

下面则演示,会议室的创建。

首先,可以利用上面的代码创建用户,也可以直接在openfire的后台直接添加用户,怎么喜欢怎么来。

我现有如下用户


创建一个公共的文件,openFire4Action代码如下

import org.jivesoftware.smack.*;import org.jivesoftware.smack.packet.Message;import org.jivesoftware.smack.packet.Packet;import org.jivesoftware.smack.util.StringUtils;import org.jivesoftware.smackx.Form;import org.jivesoftware.smackx.FormField;import org.jivesoftware.smackx.muc.DiscussionHistory;import org.jivesoftware.smackx.muc.MultiUserChat;import java.util.*;/** * wen */public class openFire4Action {    private final static String server = "wen";    Map<String,MultiUserChat> map = new HashMap<String, MultiUserChat>();    /**     * 创建会议室     * @param roomName     * @param connection     */    public void createChatRoom(String roomName, Connection connection){        if (connection == null) {            return;        }        try {            // 创建一个MultiUserChat            MultiUserChat muc = new MultiUserChat(connection, roomName                    + "@conference." + connection.getServiceName());            // 创建聊天室            muc.create(roomName); // roomName房间的名字            // 获得聊天室的配置表单            Form form = muc.getConfigurationForm();            // 根据原始表单创建一个要提交的新表单。            Form submitForm = form.createAnswerForm();            // 向要提交的表单添加默认答复            for (Iterator<FormField> fields = form.getFields(); fields                    .hasNext();) {                FormField field = (FormField) fields.next();                if (!FormField.TYPE_HIDDEN.equals(field.getType())                        && field.getVariable() != null) {                    // 设置默认值作为答复                    submitForm.setDefaultAnswer(field.getVariable());                }            }            // 设置聊天室的新拥有者            List<String> owners = new ArrayList<String>();            owners.add(connection.getUser());// 用户JID            submitForm.setAnswer("muc#roomconfig_roomowners", owners);            // 设置聊天室是持久聊天室,即将要被保存下来            submitForm.setAnswer("muc#roomconfig_persistentroom", false);            // 房间仅对成员开放            submitForm.setAnswer("muc#roomconfig_membersonly", false);            // 允许占有者邀请其他人            submitForm.setAnswer("muc#roomconfig_allowinvites", true);            // 进入是否需要密码            //submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);            // 设置进入密码            //submitForm.setAnswer("muc#roomconfig_roomsecret", "password");            // 能够发现占有者真实 JID 的角色            // submitForm.setAnswer("muc#roomconfig_whois", "anyone");            // 登录房间对话            submitForm.setAnswer("muc#roomconfig_enablelogging", true);            // 仅允许注册的昵称登录            submitForm.setAnswer("x-muc#roomconfig_reservednick", true);            // 允许使用者修改昵称            submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);            // 允许用户注册房间            submitForm.setAnswer("x-muc#roomconfig_registration", false);            // 发送已完成的表单(有默认值)到服务器来配置聊天室            submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);            // 发送已完成的表单(有默认值)到服务器来配置聊天室            muc.sendConfigurationForm(submitForm);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 加入会议室     *     * @param user 昵称     * @param password 会议室密码     * @param roomsName 会议室名     * @param connection     */    public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName,                                                  Connection connection) {        try {            // 使用XMPPConnection创建一个MultiUserChat窗口            MultiUserChat muc = new MultiUserChat(connection, roomsName                    + "@conference." + connection.getServiceName());            // 聊天室服务将会决定要接受的历史记录数量            DiscussionHistory history = new DiscussionHistory();            history.setMaxStanzas(0);            // 用户加入聊天室            muc.join(user, password, history, SmackConfiguration.getPacketReplyTimeout());            System.out.println("会议室加入成功+++++++++++++++++++++++++++++++++");            return muc;        } catch (XMPPException e) {            e.printStackTrace();            System.out.println("会议室加入失败------------------------------");            return null;        }    }    /**     * 连接openfire服务器     * @return     */    public static XMPPConnection getXMPPConnection() {        try {            ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.252", 5222, server);            config.setReconnectionAllowed(false);            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);            config.setSendPresence(true);            XMPPConnection connection = new XMPPConnection(config);            connection.connect();            return connection;        } catch (XMPPException e) {            e.printStackTrace();        }        return null;    }    /**     * 查询会议室成员名字     * @param muc     */    public static List<String> findMulitUser(MultiUserChat muc){        List<String> listUser = new ArrayList<String>();        Iterator<String> it = muc.getOccupants();        //遍历出聊天室人员名称        while (it.hasNext()) {            // 聊天室成员名字            String name = StringUtils.parseResource(it.next());            listUser.add(name);        }        return listUser;    }    /**     * 用户登录和发送     * @param username     * @param password     * @param roomusername     * @param roompasswd     * @param roomname     * @param flag     */    //flag 是分辨,是否是创建会议室的用户登录    public static void getConferenceRoom(String username,String password,String roomusername,String roompasswd,String roomname,boolean flag) {        //连接openfire服务器        Connection c = openFire4Action.getXMPPConnection();        //自己必须先登录,不然会报错,        try {            c.login(username,password);        } catch (XMPPException e) {            e.printStackTrace();        }        if(flag){            openFire4Action smack4 = new openFire4Action();            //创建一个会议室,“yiqihai”C是连接服务器的通道            smack4.createChatRoom("yiqihai", c);        }        MultiUserChat mu = openFire4Action.joinMultiUserChat(roomusername, roompasswd, roomname, c);        mu.addMessageListener(new PacketListener() {            @Override            public void processPacket(Packet packet) {                Message message = (Message) packet;                if (message.getBody() != null) {                    System.out.println("【"                            + message.getFrom() + "】: "                            + message.getBody());                }            }        });        Scanner input = new Scanner(System.in);        while (true) {            String message = input.nextLine();            try {                mu.sendMessage(message);            } catch (XMPPException e) {                e.printStackTrace();            }        }    }}

下面我再建立4个文件进行模拟用户,

分别为

PersonClass1

PersonClass2

PersonClass3

PersonClass4

代码如下:

PersonClass1:

/** * 用户1 */public class PersonClass1 {    public static void main(String[] args) {        openFire4Action.getConferenceRoom("user3","1","土豆1","1","yiqihai",true);    }}
PersonClass2:

/** * 用户2 */public class PersonClass2 {    public static void main(String[] arge){        openFire4Action.getConferenceRoom("user2","123456","土豆2","1","yiqihai",false);    }}
PersonClass3:

/** * 用户三 */public class PersonClass3 {    public static void main(String[] args) {        openFire4Action.getConferenceRoom("user5","123456","土豆3","1","yiqihai",false);    }}
PersonClass4:

/** * 用户四 */public class PersonClass4 {    public static void main(String[] args) {        openFire4Action.getConferenceRoom("user6","123456","土豆4","1","yiqihai",false);    }}

效果如下:





0 0
原创粉丝点击