用smack+openfire作即时通信

首发:我的博客java

必须说明:smack最新的4.1.1,相对以前版本变化很大,并且资料缺少,官方文档也很差,因此仍是用老版本3.2.2吧。这篇博文中的代码是4.1.1版的,但不推荐用它。
用openfire作服务器,用spark作帮助调试的客户端,用smack(官方文档在这里,感受写得很是很差)作java的库,来完成即时通信功能。服务器

1.安装openfire
官网下载安装便可。oracle

2.安装spark
官网下载安装便可。jsp

3.maven引入smackmaven

        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-java7</artifactId>
                <version>4.1.1</version>
                <exclusions>
                    <exclusion>
                        <groupId>xpp3</groupId>
                        <artifactId>xpp3</artifactId>
                    </exclusion>
                </exclusions>
        </dependency>
        <dependency>
            <groupId>xpp3</groupId>
            <artifactId>xpp3</artifactId>
            <version>1.1.3.4.O</version>
        </dependency>
        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-tcp</artifactId>
                <version>4.1.1</version>
        </dependency>
        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-im</artifactId>
                <version>4.1.1</version>
        </dependency>
        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-extensions</artifactId>
                <version>4.1.1</version>
        </dependency>tcp

若是提示找不到就手动安装一下吧,在maven仓库找到jar并手动下载以后,执行相似下面这条语句:ide

mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar函数

4.编写demo代码作实验
关键的概念:配置,链接,花名册,会话管理者,会话ui

 

import java.util.Collection;spa

import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.chat.Chat;
import org.jivesoftware.smack.chat.ChatManager;
import org.jivesoftware.smack.chat.ChatManagerListener;
import org.jivesoftware.smack.chat.ChatMessageListener;
import org.jivesoftware.smack.filter.StanzaFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterListener;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;

public class SmackClient {        public static void countPeople(Roster r){        System.out.println("在线人数变为:" + r.getEntryCount());    }        public static void go(){        try{            //对链接的配置            XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();            builder.setUsernameAndPassword("guoguo", "cc19881031");            builder.setServiceName("127.0.0.1");            builder.setHost("127.0.0.1");            builder.setPort(5222);            //不加这行会报错,由于没有证书            builder.setSecurityMode(SecurityMode.disabled);            builder.setDebuggerEnabled(true);            XMPPTCPConnectionConfiguration config = builder.build();                        //创建链接并登录            AbstractXMPPConnection c = new XMPPTCPConnection(config);                        c.addPacketSendingListener(new StanzaListener(){                @Override                public void processPacket(Stanza st)                        throws NotConnectedException {                    System.out.println("in StanzaListener:" + st.getFrom());                }            }, new StanzaFilter(){                @Override                public boolean accept(Stanza st) {                    System.out.println("in StanzaFilter:" + st.getFrom());                    return false;                }            });                        c.connect();            c.login();                        final Roster roster = Roster.getInstanceFor(c);            Presence p = roster.getPresence("admin@127.0.0.1");            System.out.println(p.getType());            roster.addRosterListener(new RosterListener() {                public void entriesAdded(Collection<String> arg0) {countPeople(roster);}                public void entriesDeleted(Collection<String> addresses) {countPeople(roster);}                public void entriesUpdated(Collection<String> addresses) {countPeople(roster);}                public void presenceChanged(Presence presence) {countPeople(roster);}            });            //            //设置是否在线状态,和状态说明//            Presence presence = new Presence(Presence.Type.unavailable);//            presence.setStatus("Gone fishing");//            c.sendStanza(presence);                        //会话管理者的创建和配置监听            ChatManager chatmanager = ChatManager.getInstanceFor(c);            chatmanager.addChatListener(new ChatManagerListener() {                @Override                public void chatCreated(Chat cc, boolean bb) {                    //当收到来自对方的消息时触发监听函数                    cc.addMessageListener(new ChatMessageListener() {                        @Override                        public void processMessage(Chat cc, Message mm) {                            System.out.println(mm.getBody());                        }                    });                }            });                        //创建会话            Chat chat = chatmanager.createChat("admin@127.0.0.1");            chat.getThreadID();                        //发消息            Message msg = new Message();            msg.setBody("hello!");            chat.sendMessage(msg);                        while(true);        }catch(Exception e){            e.printStackTrace();        }    }        public static void main(String[] args) {        go();    }}

相关文章
相关标签/搜索