最近公司的项目需要用到即时通讯技术,就花了一点时间对即时通讯技术进行研究。经过调研发现,通过openfire+spark+smack就可以实现。废话不多说,下面我们就来讲一下具体的实现。
1.什么叫openfire?
openfire是一个即时通讯服务器,也称之为即时通讯平台。它是基于XMPP协议的,大家所熟悉的通讯软件QQ、MSN和Gtalk等等,其中Gtalk就是基于XMPP协议的实现。
在即时通讯中往往因为需要保存一些状态或者数据所以不能采用点对点通讯,而是需要搭建服务器来转发。
2.spark是什么?
spark从本质上来说就是一个运行在PC上的java程序,你可以看成是官方为我们实现好的运行在PC上的客户端,我们只需要下载使用即可。
(当然如果你项目的需求现有的spark无法满足,你可以选择在官方下载spark的源码,对它进行修改)
3.smack是什么?
smack你可以看成是一套封装好了的用于实现XMPP协议传输的API,它是一个非常简单并且功能强大的类库,给用户发送消息只需要三行代码。
下面我将一些比较重要的代码片段展示出来:
// 连接参数
ConnectionConfiguration connConfig = new ConnectionConfiguration("192.168.0.1", 5222);
connConfig.setReconnectionAllowed(true);
connConfig.setSecurityMode(SecurityMode.disabled); // SecurityMode.required/disabled
connConfig.setSASLAuthenticationEnabled(false); // true/false
connConfig.setCompressionEnabled(false);
// 配置服务器
XMPPConnection connection = new XMPPConnection(connConfig);
try {
// 连接服务器
connection.connect();
// 用户登录
connection.login("joe", "123456");
// 向另一个用户发出聊天
Chat chat = connection.getChatManager().createChat("admin@192.168.0.1/Spark 2.6.3", new MessageListener() {
// 消息回复函数
@Override
public void processMessage(Chat arg0, Message arg1) {
System.out.println("Received message: " + arg1.getBody());
try
{
arg0.sendMessage("我已收到");
} catch (XMPPException e)
{
e.printStackTrace();
}
}
});
// 发送聊天信息
chat.sendMessage("Hello!");
文件传输的重要代码片段:(请注意更换你自己的服务器地址、用户名和密码以及想要访问的用户名)
// 连接参数
ConnectionConfiguration connConfig = new ConnectionConfiguration("192.168.0.1", 5222);
connConfig.setReconnectionAllowed(true);
connConfig.setSecurityMode(SecurityMode.disabled); // SecurityMode.required/disabled
connConfig.setSASLAuthenticationEnabled(false); // true/false
connConfig.setCompressionEnabled(false);
// 配置服务器
XMPPConnection connection = new XMPPConnection(connConfig);
try {
// 连接服务器
connection.connect();
// 用户登录
connection.login("joe", "123456");
// 准备发送的文件
File file = new File(PATH);
FileTransferManager transferManager = new FileTransferManager(
connection);
OutgoingFileTransfer outgoingFileTransfer = transferManager
.createOutgoingFileTransfer("admin@192.168.0.1/Spark 2.6.3");
// 发送文件
outgoingFileTransfer.sendFile(file, file.getName());
// 接收文件监听
transferManager
.addFileTransferListener(new FileTransferListener() {
public void fileTransferRequest(
FileTransferRequest request) {
try {
// 接收文件
IncomingFileTransfer transfer = request
.accept();
// 接收文件存放的位置
transfer.recieveFile(new File(PATH));
} catch (Exception e) {
Log.e("RecFile Ex In!",
e.getMessage());
}
}
});
} catch (XMPPException e) {
e.printStackTrace();
}
}