java+smack+openfire即時通訊Im(一)
簡介
使用java+smack+openfire完成簡單的即時通訊,包括登錄、註冊、添加好友、獲取好友列表、獲取離線信息等。
openfire服務器搭建
之前一篇文章已經寫了服務器的搭建,以及一個簡單的strophe.js連接openfire的web客戶端。可以參考一下:
使用strophe.js連接openfire服務器實現web端即時通訊
smack API文檔以及相關jar包下載
開發文檔:smack java API文檔
openfire這個東西確實很老了,所以文檔說明也不是很多,而且是英文的,英文不好的可以使用瀏覽器的翻譯將就一下把,還是勉強能看懂的。
用到的jar包的話就比較肯定得,我在這裏也遇到了好多坑,一開始是在官網下的包,然後導入項目以後不是少這個就是少那個,就算包是對的,裏面的方法也不全。所以後面都是一邊寫,然後看具體少那一個包,這樣一個一個導進去。
給大家推薦一個搜包的網址:maven jar,一般的包都是能搜到的。
基本上就用到了下面的幾個jar包:
CSDN下載地址:smack相關jar包下載地址
下載好了以後放在項目的WEB-INF下的lib下,然後發佈就可以了。
登錄、註冊
包全部導完以後就可以開始進行開發了
初始化鏈接
/***
*
* <B>方法名稱:</B>initOpenfireConnect<BR>
* <B>概要說明:</B>初始化openfire連接<BR>
*
* @param
* @return org.jivesoftware.smack.tcp.XMPPTCPConnection
*
* @author ZhangYH
* @date 2020/4/1 13:59
*/
public static XMPPTCPConnection initOpenfireConnect() {
XMPPTCPConnection connection = null;
try {
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
//設置服務器名稱
configBuilder.setServiceName(OPENFIRE_SERVICE_NAME);
//設置服務器地址(ip)
configBuilder.setHost(OPENFIRE_HOST);
//設置服務器端口
configBuilder.setPort(OPENFIRE_PORT);
configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.disabled);
//設置登錄狀態爲離線(這個很重要,不設置的話,接收不到離線消息)
configBuilder.setSendPresence(false);
connection = new XMPPTCPConnection(configBuilder.build());
// 連接服務器
connection.connect();
}catch (Exception e){
e.printStackTrace();
}
return connection;
}
把openfire服務器相關的信息設置進去,然後調用connect()方法就可以完成連接初始化了。
註冊
/***
*
* <B>方法名稱:</B>openfireRegister<BR>
* <B>概要說明:</B>用戶註冊<BR>
*
* @param userName
* @param password
* @return void
*
* @author ZhangYH
* @date 2020/4/1 14:06
*/
public static void openfireRegister(String userName, String password){
try {
XMPPTCPConnection connection = initOpenfireConnect();
//創建用戶
AccountManager manager = AccountManager.getInstance(connection);
manager.createAccount(userName, password);
}catch (Exception e){
e.printStackTrace();
}
}
登錄
登錄的話,初始化連接完了以後直接調用login()方法即可。
XMPPTCPConnection connection = initOpenfireConnect();
connection.login(userName,password);
以上就是連接openfire完成登錄、註冊的全部過程了。其實最麻煩的就是導包的那個地方,因爲現在網上版本很多很多,隨便下載一個一下還不能用,沒辦法,只能一個一個導了。
完整代碼:
package com.yonghon.smack.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.net.*;
import java.io.*;
import org.apache.commons.lang3.StringUtils;
import org.jivesoftware.smack.chat.Chat;
import org.jivesoftware.smack.chat.ChatManager;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.iqregister.AccountManager;
import org.jivesoftware.smackx.offline.OfflineMessageHeader;
import org.jivesoftware.smackx.offline.OfflineMessageManager;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.pubsub.LeafNode;
import org.jivesoftware.smackx.pubsub.PubSubManager;
import org.jivesoftware.smackx.pubsub.Subscription;
import org.jivesoftware.smackx.pubsub.Item;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
public class OpenfireUtils {
//服務器名稱
private static String OPENFIRE_SERVICE_NAME = "YongHon";
//地址
private static String OPENFIRE_HOST = "127.0.0.1";
//端口
private static int OPENFIRE_PORT = 端口;
//獲取好友在線狀態的URL地址
private static String OPENFIRE_PRESENCE_URL = "http://Yonghon:9090/plugins/presence/status";
/***
*
* <B>方法名稱:</B>initOpenfireConnect<BR>
* <B>概要說明:</B>初始化openfire連接<BR>
*
* @param
* @return org.jivesoftware.smack.tcp.XMPPTCPConnection
*
* @author ZhangYH
* @date 2020/4/1 13:59
*/
public static XMPPTCPConnection initOpenfireConnect() {
XMPPTCPConnection connection = null;
try {
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
//設置服務器名稱
configBuilder.setServiceName(OPENFIRE_SERVICE_NAME);
//設置服務器地址(ip)
configBuilder.setHost(OPENFIRE_HOST);
//設置服務器端口
configBuilder.setPort(OPENFIRE_PORT);
configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.disabled);
//設置登錄狀態爲離線(這個很重要,不設置的話,接收不到離線消息)
configBuilder.setSendPresence(false);
connection = new XMPPTCPConnection(configBuilder.build());
// 連接服務器
connection.connect();
//登錄
//connection.login(“userName”,“password”);
}catch (Exception e){
e.printStackTrace();
}
return connection;
}
/***
*
* <B>方法名稱:</B>closeConnection<BR>
* <B>概要說明:</B>關閉連接<BR>
*
* @param connection
* @return void
*
* @author ZhangYH
* @date 2020/4/1 14:03
*/
public static void closeConnection(XMPPTCPConnection connection) {
connection.disconnect();
}
/***
*
* <B>方法名稱:</B>openfireRegister<BR>
* <B>概要說明:</B>用戶註冊<BR>
*
* @param userName
* @param password
* @return void
*
* @author ZhangYH
* @date 2020/4/1 14:06
*/
public static void openfireRegister(String userName, String password){
try {
XMPPTCPConnection connection = initOpenfireConnect();
//創建用戶
AccountManager manager = AccountManager.getInstance(connection);
manager.createAccount(userName, password);
}catch (Exception e){
e.printStackTrace();
}
}
}