openfire+asmack
虽然说自己在openfire和asmack上面花的时间不是特别多,但是好歹做过一阵子,现在回头一看,好多都不记得。
有必要记一笔。
我认为要开发asmack,下载openfire服务端和spark客户端是必不可少的,你可以从这两个开源项目中,知道你能够开发出什么效果。Beem我也下载来用过,不太好用。
1.在asmack上做的第一个功能是创建账户
connectionConfig = new ConnectionConfiguration(xmppserver,
Integer.parseInt(xmppport));
connectionConfig.setSASLAuthenticationEnabled(false);
connection = new XMPPConnection(connectionConfig);
AccountManager manager = new AccountManager(connection);
manager.createAccount(myApp.getUsername(), myApp.getUserpassword());
这个功能比较简单,没有难度。
2.其次是聊天室收发消息
此功能也极为简单,后来这块废弃不用了,我也就忘记了,只知道大致就需要进入MultiUserChat,加上监听就行了。
MultiUserChat chat = new MultiUserChat(connection, "zk@xiaokangkang-pc/Spark 2.6.3 ");
chat.join("Mr zk");//昵称进入聊天室
chat.addMessageListener(new PacketListener() {
@Override
public void processPacket(Packet arg0) {
// TODO Auto-generated method stub
}
});
3. 接下来的就是接收信息的功能和多人聊天室没有差别:
PacketListener listener = new PacketListener() {
@Override
public void processPacket(Packet packet) {
Message msg = (Message) packet;
// 存下来的数据
String result = msg.getBody();
myApp.setMessage(result);
Intent intent = new Intent();
intent.setAction("GET_MESSAGE");
MessageService.this.sendBroadcast(intent);
}
};
connection.addPacketListener(listener, null);
4.最有难度的要数传文件:(网上所说的离线文件传输,我没能实现,网上说的方法我都不是很认可,我觉得实现这个功能,自己做一个openfire的插件比较可行,通过修改asmack包来实现,我不认为能行)
// 接收文件
public void receiveFile() {
FileTransferManager manager = new FileTransferManager(connection);
manager.addFileTransferListener(new RecFileTransferListener());
}
主要代码就是通过这个RecFileTransferListener来实现的,使用socks5 bytestream,不太清楚,是xmpp传输用的流吧,反正都是处理流
public void fileTransferRequest(FileTransferRequest request) {
Log.i("--", "接收文件开始.....");
final IncomingFileTransfer inTransfer = request.accept();
// final String fileName = request.getFileName();
long length = request.getFileSize();
Log.i("--", "文件大小:" + length + " " + inTransfer.getFileSize());
Log.i("--", "" + request.getMimeType());
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
InputStream in = new BufferedInputStream(
inTransfer.recieveFile());
String fileName = inTransfer.getFileName();
File file = new File(Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/" + "hy_ht_new/test/" + fileName);
OutputStream out = new FileOutputStream(file);
byte[] b = new byte[1024];
int temp = 0;
while ((temp = in.read(b)) != -1) {
out.write(b, 0, temp);
out.flush();
}
Log.i("--", "接收文件大小:" + file.length());
in.close();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
5.当然接收的用到了,发送的我也去试了下,不算难:
// 发送文件
private void sendFile(String user, XMPPConnection connection) {
FileTransferManager manager = new FileTransferManager(connection);
final OutgoingFileTransfer outTransfer = manager
.createOutgoingFileTransfer(user);
final long timeOut = 1000000;
final long sleepMin = 3000;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
int rs = 0;
long spTime = 0;
File file = new File(Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/" + "hy_ht_new/" + "MPolice_old.apk");
outTransfer.sendFile(file, "jjjj");
rs = outTransfer.getStatus().compareTo(
FileTransfer.Status.complete);
while (rs != 0) {
rs = outTransfer.getStatus().compareTo(
FileTransfer.Status.complete);
spTime = spTime + sleepMin;
if (spTime > timeOut) {
return;
}
Thread.sleep(sleepMin);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
对了,对于收发文件这个功能,官方的asmack包是不支持的,网上有支持的包,我也有,需要可以找我。clunyes@126.com
最烦人的要数,接收和发送文件,smack的资料网上比较多,但是很乱,问过smack大牛,大牛说你先去看spark源码。。我也去看了,看着看着我对于java.swing的东西倒是越来越熟络,是悲是喜?
openfire源码我也有,但是不敢看,太牛了,openfire插件只用过broadcast,它自带的,要配置过,具体在哪里配置完全忘记了,broadcast插件可以实现离线消息接收(hoojo大神果断发了个openfire插件的开发博客,我得去看看---http://www.cnblogs.com/hoojo/archive/2013/03/07/2947502.html)!这几个asmack是我硬着头皮做的东西,可能非常菜,但是我很喜欢,都是自己一点一点看api和网上资料看来的,遇到问题网上也没人解答(因为asmack问题都很怪异)。写到这里,我非常开心,要知道刚拿到这个任务时,我很纠结。那时入职2个月,刚刚转正,只会写些activity啊什么的,突然要搞这个,应该说我是花费了全部的精力去做的,结果也是做出来了-------同时期,还有个任务,app自动更新,也花了我将近一个礼拜啊,现在想想是很有意义的。现在想得起就这么多,以后记起再补充。