用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();    }}

相關文章
相關標籤/搜索