地址:http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html
在文章開始,請你了解和熟悉openfire方面的相關(guān)知識辆苔,這樣對你理解下面代碼以及下面代碼的用途有很好的了解算灸。同時(shí),你可能需要安裝一個簡單的CS聊天工具姑子,來測試你的代碼是否成功的在openfire服務(wù)器上建立會話鏈接账胧,并成功的向在線用戶發(fā)送聊天消息怪与。
必須了解:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html
http://www.cnblogs.com/hoojo/archive/2012/05/13/2498151.html(非windows 系統(tǒng))
可選:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506845.html
http://www.cnblogs.com/hoojo/archive/2012/06/18/2553975.html
聊天軟件Spark,用于測試聊天消息發(fā)送是否成功屹徘,下載地址:http://www.igniterealtime.org/downloads/download-landing.jsp?file=spark/spark_2_6_3.exe
然后你需要添加smack相關(guān)的jar包
smack.jar
smackx.jar
jar包下載地址:http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_2_2.zip
代碼中還用到了junit捍靠,junit jar下載地址:http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.org.junit&version=4.8.2&type=binary
下面開始代碼部分
packagecom.hoo.smack;
importjava.util.Collection;
importjava.util.Iterator;
importjavax.net.SocketFactory;
importorg.jivesoftware.smack.AccountManager;
importorg.jivesoftware.smack.Chat;
importorg.jivesoftware.smack.ChatManager;
importorg.jivesoftware.smack.Connection;
importorg.jivesoftware.smack.ConnectionConfiguration;
importorg.jivesoftware.smack.MessageListener;
importorg.jivesoftware.smack.Roster;
importorg.jivesoftware.smack.RosterEntry;
importorg.jivesoftware.smack.XMPPConnection;
importorg.jivesoftware.smack.XMPPException;
importorg.jivesoftware.smack.packet.Message;
importorg.jivesoftware.smack.packet.Presence;
importorg.jivesoftware.smack.packet.Session;
importorg.jivesoftware.smack.packet.Message.Type;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
/**
* function: 利用Smack框架完成 XMPP 協(xié)議通信
* @author hoojo
* @createDate 2012-5-22 上午10:28:18
* @file ConnectionServerTest.java
* @package com.hoo.smack.conn
* @project jwchat
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
publicclassSmackXMPPTest {
privateConnection connection;
privateConnectionConfiguration config;
/** openfire服務(wù)器address */
privatefinalstaticString server ="192.168.8.32";
privatefinalvoidfail(Object o) {
if(o != null) {
System.out.println(o);
}
}
privatefinalvoidfail(Object o, Object... args) {
if(o != null && args != null && args.length > 0) {
String s = o.toString();
for(inti = 0; i < args.length; i++) {
String item = args[i] == null ?"": args[i].toString();
if(s.contains("{"+ i +"}")) {
s = s.replace("{"+ i +"}", item);
}else{
s +=" "+ item;
}
}
System.out.println(s);
}
}
/**
* function: 初始Smack對openfire服務(wù)器鏈接的基本配置
* @author hoojo
* @createDate 2012-6-25 下午04:06:42
*/
@Before
publicvoidinit() {
try{
//connection = new XMPPConnection(server);
//connection.connect();
/** 5222是openfire服務(wù)器默認(rèn)的通信端口沐旨,你可以登錄http://192.168.8.32:9090/到管理員控制臺查看客戶端到服務(wù)器端口 */
config =newConnectionConfiguration(server, 5222);
/** 是否啟用壓縮 */
config.setCompressionEnabled(true);
/** 是否啟用安全驗(yàn)證 */
config.setSASLAuthenticationEnabled(true);
/** 是否啟用調(diào)試 */
config.setDebuggerEnabled(false);
//config.setReconnectionAllowed(true);
//config.setRosterLoadedAtLogin(true);
/** 創(chuàng)建connection鏈接 */
connection =newXMPPConnection(config);
/** 建立連接 */
connection.connect();
}catch(XMPPException e) {
e.printStackTrace();
}
fail(connection);
fail(connection.getConnectionID());
}
@After
publicvoiddestory() {
if(connection != null) {
connection.disconnect();
connection = null;
}
}
/**
* function: ConnectionConfiguration 的基本配置相關(guān)信息
* @author hoojo
* @createDate 2012-6-25 下午04:11:25
*/
@Test
publicvoidtestConfig() {
fail("PKCS11Library: "+ config.getPKCS11Library());
fail("ServiceName: {0}", config.getServiceName());
// ssl證書密碼
fail("TruststorePassword: {0}", config.getTruststorePassword());
fail("TruststorePath: {0}", config.getTruststorePath());
fail("TruststoreType: {0}", config.getTruststoreType());
SocketFactory socketFactory = config.getSocketFactory();
fail("SocketFactory: {0}", socketFactory);
/*try {
fail("createSocket: {0}", socketFactory.createSocket("localhost", 3333));
} catch (IOException e) {
e.printStackTrace();
}*/
}
/**
* function: Connection 基本方法信息
* @author hoojo
* @createDate 2012-6-25 下午04:12:04
*/
@Test
publicvoidtestConnection() {
/** 用戶管理 */
AccountManager accountManager = connection.getAccountManager();
for(String attr : accountManager.getAccountAttributes()) {
fail("AccountAttribute: {0}", attr);
}
fail("AccountInstructions: {0}", accountManager.getAccountInstructions());
/** 是否鏈接 */
fail("isConnected:", connection.isConnected());
fail("isAnonymous:", connection.isAnonymous());
/** 是否有權(quán)限 */
fail("isAuthenticated:", connection.isAuthenticated());
fail("isSecureConnection:", connection.isSecureConnection());
/** 是否使用壓縮 */
fail("isUsingCompression:", connection.isUsingCompression());
}
/**
* function: 用戶管理器
* @author hoojo
* @createDate 2012-6-25 下午04:22:31
*/
@Test
publicvoidtestAccountManager() {
AccountManager accountManager = connection.getAccountManager();
for(String attr : accountManager.getAccountAttributes()) {
fail("AccountAttribute: {0}", attr);
}
fail("AccountInstructions: {0}", accountManager.getAccountInstructions());
fail("supportsAccountCreation: {0}", accountManager.supportsAccountCreation());
try{
/** 創(chuàng)建一個用戶boy,密碼為boy榨婆;你可以在管理員控制臺頁面http://192.168.8.32:9090/user-summary.jsp查看用戶/組的相關(guān)信息磁携,來查看是否成功創(chuàng)建用戶 */
accountManager.createAccount("boy","boy");
/** 修改密碼 */
accountManager.changePassword("abc");
}catch(XMPPException e) {
e.printStackTrace();
}
}
@Test
publicvoidtestUser() {
try{
/** 用戶登陸,用戶名良风、密碼 */
connection.login("hoojo","hoojo");
}catch(XMPPException e) {
e.printStackTrace();
}
/** 獲取當(dāng)前登陸用戶 */
fail("User:", connection.getUser());
/** 所有用戶組 */
Roster roster = connection.getRoster();
/** 好友用戶組谊迄,你可以用Spark添加用戶好友,這樣這里就可以查詢到相關(guān)的數(shù)據(jù) */
Collection rosterEntiry = roster.getEntries();
Iterator iter = rosterEntiry.iterator();
while(iter.hasNext()) {
RosterEntry entry = iter.next();
fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
}
fail("-------------------------------");
/** 未處理烟央、驗(yàn)證好友统诺,添加過的好友,沒有得到對方同意 */
Collection unfiledEntries = roster.getUnfiledEntries();
iter = unfiledEntries.iterator();
while(iter.hasNext()) {
RosterEntry entry = iter.next();
fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
}
}
@Test
@SuppressWarnings("static-access")
publicvoidtestPacket() {
try{
connection.login("hoojo","hoojo");
}catch(XMPPException e) {
e.printStackTrace();
}
//Packet packet = new Data(new DataPacketExtension("jojo@" + server, 2, "this is a message"));
//connection.sendPacket(packet);
/** 更改用戶狀態(tài)疑俭,available=true表示在線粮呢,false表示離線,status狀態(tài)簽名;當(dāng)你登陸后啄寡,在Spark客戶端軟件中就可以看到你登陸的狀態(tài) */
Presence presence =newPresence(Presence.Type.available);
presence.setStatus("Q我吧");
connection.sendPacket(presence);
Session session =newSession();
String sessid = session.nextID();
connection.sendPacket(session);
/** 向jojo@192.168.8.32 發(fā)送聊天消息豪硅,此時(shí)你需要用Spark軟件登陸jojo這個用戶,
* 這樣代碼就可以向jojo這個用戶發(fā)送聊天消息挺物,Spark登陸的jojo用戶就可以接收到消息
**/
/** Type.chat 表示聊天懒浮,groupchat多人聊天,error錯誤识藤,headline在線用戶嵌溢; */
Message message =newMessage("jojo@"+ server, Type.chat);
//Message message = new Message(sessid, Type.chat);
message.setBody("h!~ jojo, I'am is hoojo!");
connection.sendPacket(message);
try{
Thread.sleep(1);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
/**
* function: 測試聊天消息管理類
* @author hoojo
* @createDate 2012-6-25 下午05:03:23
*/
@Test
publicvoidtestChatManager() {
/** 設(shè)置狀態(tài) */
try{
connection.login("hoojo","hoojo");
}catch(XMPPException e) {
e.printStackTrace();
}
/** 設(shè)置狀態(tài) */
Presence presence =newPresence(Presence.Type.available);
presence.setStatus("Q我吧");
connection.sendPacket(presence);
/** 獲取當(dāng)前登陸用戶的聊天管理器 */
ChatManager chatManager = connection.getChatManager();
/** 為指定用戶創(chuàng)建一個chat,MyMessageListeners用于監(jiān)聽對方發(fā)過來的消息? */
Chat chat = chatManager.createChat("jojo@"+ server,newMyMessageListeners());
try{
/** 發(fā)送消息 */
chat.sendMessage("h!~ jojo……");
/** 用message對象發(fā)送消息 */
Message message =newMessage();
message.setBody("message");
message.setProperty("color","red");
chat.sendMessage(message);
}catch(XMPPException e) {
e.printStackTrace();
}
try{
Thread.sleep(1000 * 1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
/**
* function: 消息監(jiān)聽器蹋岩,用戶監(jiān)聽對方發(fā)送的消息赖草,也可以想對方發(fā)送消息
* @author hoojo
* @createDate 2012-6-25 下午05:05:31
* @file SmackXMPPTest.java
* @package com.hoo.smack
* @project jwchat
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
classMyMessageListenersimplementsMessageListener {
publicvoidprocessMessage(Chat chat, Message message) {
try{
/** 發(fā)送消息 */
chat.sendMessage("dingding……"+ message.getBody());
}catch(XMPPException e) {
e.printStackTrace();
}
/** 接收消息 */
fail("From: {0}, To: {1}, Type: {2}, Sub: {3}", message.getFrom(), message.getTo(), message.getType(), message.toXML());
/*Collection bodys =? message.getBodies();
for (Body body : bodys) {
fail("bodies[{0}]", body.getMessage());
}
//fail(message.getLanguage());
//fail(message.getThread());
//fail(message.getXmlns());*/
fail("body: ", message.getBody());
}
}
}
好了,這些都是smack的基本功能剪个,還有更多的東西需要研究秧骑,下次有機(jī)會再分享!