这是一个基于XMPP协议的Android即时通信客户端,用的是Smack库,服务器用时Openfire服务器。
Openfire服务器的搭建与开发这里不做介绍,只讨论基于Smack库的Android即时通信客户端。
本客户端实现了文字消息,图片消息,离线通知,群聊,还有其他一些小细节等功能。
核心代码其实就是Smack库的几个方法,其他代码就像其他Android应用开发一样,按照功能需求开发。
不废话,直接上发送消息和接收消息代码:
发送代码:
// send message logic
public synchronized void sendMessage(BaseItem baseItem) throws SmackException.NotConnectedException, ConnectException {
Chat chat;
if (dataManagerInstance.getChats().containsKey(baseItem.getUserJID())) {
chat = dataManagerInstance.getChats().get(baseItem.getUserJID());
} else {
try {
chat = getChatManager().createChat(baseItem.getUserJID());
dataManagerInstance.getChats().put(baseItem.getUserJID(), chat);
Log.e(TAG, "sendMessage: sendMsg=" + baseItem.getMesage());
} catch (NullPointerException e) {
Log.e(TAG, "sendMessage: getXmppTcpConnectionInstance()==null 没连接服务器 NullPointerException=" + e.getMessage());
throw new ConnectException();
}
}
Message message = new Message();
// this is the name of which send this message;
message.setSubject(DataManager.getDataManagerInstance().getCurrentMasterUserName());
message.setBody(baseItem.getMesage());
message.setFrom(Constants.AppConfigConstants.CLIENT_EMAIL);
message.setTo(baseItem.getUserJID());
chat.sendMessage(message);
dataManagerInstance.collectMessages(baseItem);
// show the message in the ChattingRoomFragment
createRecentChatRecord(baseItem);
}
接收核心代码:
@Override // Receive message logic
public void processMessage(Chat chat, Message message) {
String JIDFromUserSendMsg = message.getFrom();
if (JIDFromUserSendMsg.contains("/")) {
JIDFromUserSendMsg = JIDFromUserSendMsg.split("/")[0];
}
// Using a hashmap to manage the chats , which is very conenient to reuse;
dataManagerInstance.getChats().put(JIDFromUserSendMsg, chat);
String receivedMsg = message.getBody();
String userNameFrom = message.getSubject();
if (userNameFrom == null || userNameFrom.trim().equals("")) {
userNameFrom = JIDFromUserSendMsg.split("@")[0];
}
if (receivedMsg != null) {
Log.e(TAG, "processMessage: receivedMsg=" + receivedMsg);
receiveAndSaveMsg(JIDFromUserSendMsg, receivedMsg, userNameFrom, MessageRvAdapter.TEXT_MESSAGE_VIEW_TYPE, "");///暂时设置为null
}
}
private synchronized void receiveAndSaveMsg(String JIDFromUserSendMsg, String receivedMsg
, String userNameFrom, int viewType, String imagePath) {
MessageItem messageItem = saveTheMessageInfo(JIDFromUserSendMsg, receivedMsg, userNameFrom
, true, viewType, imagePath);
createRecentChatRecord(messageItem);
if (currentActivity != null && JIDFromUserSendMsg
.equals(DataManager.getDataManagerInstance().getCurrentChattingUserJID())) {
// show massage
showMessageIntheChattingRoomFragment(messageItem);
} else {
// notify coming message
notifyComingMessageInStateBar(JIDFromUserSendMsg, receivedMsg, userNameFrom);
}
}
项目的源码下载以及项目的github管理地址:点击打开链接