Openfire构成
服务端:
Openfire单台支持1W并发,核心通信方式mina,通信协议xmpp
客户端
Smack 提供java语言API客户端
Spark 提供Openfire的桌面客户端,使用Smack客户端集成与Openfire服务器通信
实战篇
第一步:
先安装openfire服务端,下载安装包,下载地址为:http://www.igniterealtime.org/downloads/index.jsp。解压启动openfire服务地址为http://IP:9090/
,安装过程中要提前创建openfire数据库,其他填写正确资料点击下一步即可。
第二步:
安装Spark对open服务端,下载安装包最好是使用Windows客户端测试,下载地址同上。Spark客户端为exe,点击执行即可
第三步:
使用Spark客户端连接openfire通信测试。使用Spark无法手动注册用户,密钥验证不通过,报(图一)错误,可能是由于我域名使用的IP地址导致。只能通过Openfire服务添加用户信息如(图二)。添加完成后,在Spark上登录前,需设置高级选项,如下(图三),假如域名是ip,必须勾选倒数第二个复选框,方能登录成功。
(图一)
(图二)
(图三)
第四步:
使用Smack客户端,编写java代码测试,并发送短信。
mvn配置如下:
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-core</artifactId>
<version>4.3.4</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-extensions</artifactId>
<version>4.3.4</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>4.3.4</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java7</artifactId>
<version>4.3.4</version>
</dependency>
客户端登录openfire以及消息发送代码如下
package com.eddue;
import java.io.IOException;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.chat2.ChatManager;
import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
public class Test {
private static XMPPTCPConnectionConfiguration config;
private static AbstractXMPPConnection conn;
static {
try {
config = XMPPTCPConnectionConfiguration.builder()
.setXmppDomain("192.168.0.229")
.setHost("192.168.0.229")
.setPort(5222)
.setDebuggerFactory(SmackConfiguration.getDefaultSmackDebuggerFactory())
.setSecurityMode(SecurityMode.disabled)
.build();
conn = new XMPPTCPConnection(config);
conn.connect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void login(String username,String password){
try {
if(conn!=null){
conn.login(username, password);
System.out.println("user "+username+" login successfully.");
}
} catch (XMPPException e) {
e.printStackTrace();
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@SuppressWarnings("deprecation")
public static void sendMessage(String username,String password,String msg){
//先登录
login(username, password);
//再构建聊天室
ChatManager cm = ChatManager.getInstanceFor(conn);
cm.addIncomingListener(new IncomingChatMessageListener() {
@Override
public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {
System.out.println("message from : "+from+" : "+message.getBody());
}
});
try {
EntityBareJid jid = JidCreate.entityBareFrom("smack@192.168.0.229");
Chat chat = cm.chatWith(jid);
Message message = new Message();
message.setBody(msg);
chat.send(message);
while (true){}
} catch (XmppStringprepException e) {
e.printStackTrace();
} catch (NotConnectedException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main( String[] args ){
sendMessage("openfire", "123456", "hello,smack 1111");
}
}
第五步:
查看结果如下,表明测试成功