openfire安装:
- OpenFire是基于XMPP协议的纯java实现的服务器,Google Talk就用的它。
- 环境: linux, jdk5 or later, 数据库(这里以mysql为主,有一数据库openfire)。
下载一份linux包,解压之:
tar -zxvf openfire_3_9_1.tar.gz
会有以下目录:
bin //执行文件目录,如openfire
conf //配置文件目录
documentation //文档目录
lib //依赖jar包目录
logs //日志目录
plugins //插件目录,默认有一个web管理控制台
resources //资源目录, 如resources/database放置数据库建立sql文件,resources/security放置密钥(SSL)
- 启动openfire
bin/openfire start
支持命令: bin/openfire start|stop|status
- openfire初始化
1. 进入web控制台: ${openfire_server}:9090。
2. 语言选择。
3. 配置端口(默认)。
4. 选择数据库: 这里以MySql为例。
5. 用户及用户组: 也以数据库管理。
6. 填写数据库连接信息,数据库用域名(不要用IP)。
7. 设置一个用户。
之后登录,你应该能看到如下界面:
OpenFire配置:
- 进入管理平台创建用户testuser1, testuser2:
- 下载Spark,安装,登录。
用户也可以使用Spark客户端自己注册用户:
你可以在web管理控制台配置用户注册:
java操作实现
- 加入依赖包:smack.jar, smackx.jar
用spark登录用户testuser2:
运行下面的程序:
public class XmppManager {
private static final int packetReplyTimeout = 500; // millis
private String server;
private int port;
private ConnectionConfiguration config;
private XMPPConnection connection;
private ChatManager chatManager;
private MessageListener messageListener;
public XmppManager(String server, int port) {
this.server = server;
this.port = port;
}
public void init() throws XMPPException {
System.out.println(String.format(
"Initializing connection to server %1$s port %2$d", server,
port));
SmackConfiguration.setPacketReplyTimeout(packetReplyTimeout);
config = new ConnectionConfiguration(server, port);
config.setSASLAuthenticationEnabled(false);
config.setSecurityMode(SecurityMode.disabled);
connection = new XMPPConnection(config);
connection.connect();
System.out.println("Connected: " + connection.isConnected());
chatManager = connection.getChatManager();
messageListener = new MyMessageListener();
}
public void performLogin(String username, String password)
throws XMPPException {
if (connection != null && connection.isConnected()) {
connection.login(username, password);
}
}
public void setStatus(boolean available, String status) {
Presence.Type type = available ? Type.available : Type.unavailable;
Presence presence = new Presence(type);
presence.setStatus(status);
connection.sendPacket(presence);
}
public void destroy() {
if (connection != null && connection.isConnected()) {
connection.disconnect();
}
}
public void sendMessage(String message, String buddyJID)
throws XMPPException {
System.out.println(String.format("Sending mesage '%1$s' to user %2$s",
message, buddyJID));
Chat chat = chatManager.createChat(buddyJID, messageListener);
chat.sendMessage(message);
}
public void createEntry(String user, String name) throws Exception {
System.out.println(String.format(
"Creating entry for buddy '%1$s' with name %2$s", user, name));
Roster roster = connection.getRoster();
roster.createEntry(user, name, null);
}
class MyMessageListener implements MessageListener {
@Override
public void processMessage(Chat chat, Message message) {
String from = message.getFrom();
String body = message.getBody();
System.out.println(String.format(
"Received message '%1$s' from %2$s", body, from));
}
}
}
测试用例:
public static void main(String[] args) throws Exception {
String username = "testuser1";
String password = "testuser1";
XmppManager xmppManager = new XmppManager("openfire", 5222);
xmppManager.init();
xmppManager.performLogin(username, password);
xmppManager.setStatus(true, "Hello everyone");
String buddyJID = "testuser2";
String buddyName = "testuser2";
xmppManager.createEntry(buddyJID, buddyName);
xmppManager.sendMessage("Hi, 来自java客户端。", "testuser2@openfire");
boolean isRunning = true;
while (isRunning) {
Thread.sleep(50);
}
xmppManager.destroy();
}
于是在testuser2的spark上,你就能看到消息:
具体openfire的其他配置,可以见其document下的指南,smack使用自己再去挖掘吧。
不吝指正。