目录
XMPP协议背景:
即时通信( Instant Messaging,简称 IM) 像qq.微信
没有统一的标准,无法实现互联互通, 用统一的协议XMPP
XMPP 协议是以 XML 为基础的 ,XMPP 信息不仅可以是简单的文本,而且可以携带复杂的数据和各种格式的文件,
也就是说 XMPP 协议不仅可以用在人与人之间的交流,而且可以实现软件与软件或软件与人之间的交流
XMPP 中定义了三个角色, 客户端,服务器,网关
openfire服务端
Openfire 是基于XMPP 协议的IM 的服务器端的一个实现
参考 http://myopenfire.com/article/articledir/1
Openfire是一个Java应用程序,
Openfire采用内置的jetty作web服务器,在启动AdminConsolePlugin插件时调用startup()方法启动jetty服务器,9090为其明文端口,9091为其加密端口。 启动成功后, 可以从网站进入http://ip:9090 openfire管理控制台
设置服务端端口,客户端连接设置,策略设置,离线消息的存储
openfire需要用到数据库:
ofGroup (用户组的数据)
ofGroupUser (组成员)
ofUser (用户数据)
ofOffline (离线邮件存储)
插件开发
下载源码,生成eclipse项目,添加项目依赖的Jar包,运行openfire
Spark Smack客户端
Smack 是一个XMPP 协议的Java 实现,提供一套可扩展的API
Spark 提供了客户端一个基本的实现,并提出了一个很好的插件架构
例: java客户端发送消息
package com.openfire.client;
import java.io.IOException;
import java.util.Scanner;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.XMPPException;
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.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.filter.StanzaFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
/**
* Hello XMPP!
*
*/
public class App extends Thread
{
void say() {
};
public static void main( String[] args ) throws SmackException, IOException, XMPPException, InterruptedException
{
// 对连接的配置
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setUsernameAndPassword("admin", "123456");
builder.setServiceName("ww110"); //openfire服务端名字,登录管理后台可查看
builder.setHost("192.168.0.110");
builder.setPort(5222);
// 不加这行会报错,因为没有证书
builder.setSecurityMode(SecurityMode.disabled);
//SASLAuthentication.supportSASLMechanism("PLAIN",0);
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();
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("app2收到消息:" + cc + mm.getBody());
}
});
}
});
while (true) {
sleep(2000);
//每2秒给new1用户发消息
Chat chat = chatManager.createChat("new1@ww110");
chat.getThreadID(); Message msg = new Message();
msg.setBody("你好,我是机器人");
chat.sendMessage(msg);
}
}
}