首先得下载openfire,然后点击bin文件下的exe文件,按照步骤一步步配置可参考http://www.cnblogs.com/maxinliang/p/3582924.html,注意在设置连接数据库时,得在数据库中创建一个名为openfire的数据库。同时可以下载Spark进行测试。
然后,添加依赖和网络连接权限
compile("org.igniterealtime.smack:smack-android-extensions:4.1.2") {
exclude group: 'xpp3', module: 'xpp3'
}
compile("org.igniterealtime.smack:smack-android:4.1.2") {
exclude group: 'xpp3', module: 'xpp3'
}
compile("org.igniterealtime.smack:smack-tcp:4.1.2") {
exclude group: 'xpp3', module: 'xpp3'
}
compile("org.igniterealtime.smack:smack-im:4.1.2") {
exclude group: 'xpp3', module: 'xpp3'
}
<uses-permission android:name="android.permission.INTERNET" />
其次连接配置:
String server = "";//openfire主机ip
int port = 5222;
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setServiceName("");//openfire主机名称
builder.setHost(server);
builder.setPort(port);
builder.setCompressionEnabled(false);
builder.setDebuggerEnabled(true);
builder.setSendPresence(true);
builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
XMPPTCPConnection connection = new XMPPTCPConnection(builder.build());
连接到xmpp,网络请求的耗时操作一般写在线程中:
new Thread(new Runnable() {
@Override
public void run() {
try {
connection.connect();
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
}
}
}).start();
实现用户注册,注册用户名与密码,这里写了封装一个方法通过int型返回值判断成功或者失败:
public int register(String account, String password) {
AccountManager.sensitiveOperationOverInsecureConnectionDefault(true);
try {
AccountManager.getInstance(connection).createAccount(account,password);//注册
return 0;
} catch (SmackException.NoResponseException e) {
e.printStackTrace();
return 1;
} catch (XMPPException.XMPPErrorException e) {
e.printStackTrace();
return 2;
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
return 3;
}
}
注册成功后,可进行登录,这个很简单:
connection.login(account,password);
登录成功后则需要获取好友列表,注意一定要在确认登录成功后再获取,因为登录是在线程中,所以这里大多会有一定的延时:
List<RosterEntry> entryList = new ArrayList<RosterEntry>();
Roster roster = Roster.getInstanceFor(connection);
Set<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries){
entryList.add(entry);
}
return entryList;
entry中包含着好友的信息,例如通过
entry.getUser()
就可得到好友名,但这里的好友名是 账号名+@+主机名,例如account@sc-wangk1,发送消息时也需要的是这个。
得到好友列表后我们就可以实现接受和发送消息,接收消息通过实现监听:
ChatManager chatManager = ChatManager.getInstanceFor(connection);
chatManager.addChatListener(new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally) {
chat.addMessageListener(new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
String content = message.getBody();//获取消息内容
if(content != null){
String sender = message.getFrom().substring(0,message.getFrom().indexOf("/"));//获得发送者
if ((chatRcyAdapter != null)&&(chatRecyclerView != null)){
android.os.Message me = new android.os.Message();
me.what = 1;
me.obj = content;
handler.sendMessage(me);//使用handler来更新UI
}
}
}
});
}
});
同时也可发送消息,这里封装了一个方法:
public void sendMessage(String messageBody,String receiver){//消息内容 接收者:账号名+@+主机名
if (TextUtils.isEmpty(messageBody)){
return;
}
try {
ChatManager chatManager = ChatManager.getInstanceFor(connection);
Chat chat = chatManager.createChat(receiver);//设置接收者
chat.sendMessage(messageBody);//发送消息
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
然后可以查找好友,通过关键字查找:
UserSearchManager searchManager = new UserSearchManager(connection);
String searchService = "search."+connection.getServiceName();
Form searchForm = searchManager.getSearchForm(searchService);
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Username",true);
answerForm.setAnswer("search",usernameStr.trim());//usernameStr就是关键字,是String类型
ReportedData results=searchManager.getSearchResults(answerForm,searchService);
List<ReportedData.Row>rows=results.getRows();
for (ReportedData.Row row:rows){
String username=row.getValues("Username").get(0);//得到查询到的好友名}