300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 基于Openfire Smack开发即时通讯应用 获取离线消息 发送消息 联系人列表 添加好友(三)

基于Openfire Smack开发即时通讯应用 获取离线消息 发送消息 联系人列表 添加好友(三)

时间:2024-02-29 08:51:52

相关推荐

基于Openfire Smack开发即时通讯应用 获取离线消息 发送消息 联系人列表 添加好友(三)

一:前面两篇说了Openfire服务器的搭建和注册登录,接下来就是重点了,实现与好友之间的聊天。

二:获取用户的所有好友

XMPPTCPConnection connection

/*** 获得所有联系人*/public Roster getContact() {Roster roster = Roster.getInstanceFor(connection);//获得所有的联系人组Collection<RosterGroup> groups = roster.getGroups();for (RosterGroup group : groups) {//获得每个组下面的好友List<RosterEntry> entries = group.getEntries();for (RosterEntry entry : entries) {//获得好友基本信息entry.getUser();entry.getName();entry.getType();entry.getStatus();}}return roster;}

三:由于Smack没有提供获取历史聊天记录的Api(本人一直没有找到)所以对于聊天记录、聊天列表这一块需要自己设计数据库用来保存聊天信息;我这里就对一些重点的Api方法进行整理。

用户一上线获取离线消息,注意:要获取离线消息需要在获取XMPPTCPConnection时将登录状态设置为离线不然获取不到

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()//....//设置登录状态.setSendPresence(false)//....XMPPTCPConnection connection = new XMPPTCPConnection(config);

获取离线消息

/*** 一上线获取离线消息* 设置登录状态为在线*/private void getOfflineMessage() {OfflineMessageManager offlineManager = new OfflineMessageManager(connection);try {List<Message> list = offlineManager.getMessages();//删除离线消息offlineManager.deleteMessages();//将状态设置成在线Presence presence = new Presence(Presence.Type.available);connection.sendStanza(presence);} catch (Exception e) {e.printStackTrace();}}

四:发送一条消息,可以使用之前安装的Spark进行测试了

try {ChatManager manager = ChatManager.getInstanceFor(connection);Chat chat = manager.createChat("azhon@10.104.179.23",null);chat.sendMessage("HelloWord");} catch (SmackException.NotConnectedException e) {e.printStackTrace();}

manager.createChat(userJID, null);userJID一定是用户名@服务器ip地址否则无法发出消息

五:既然可以发送消息了,那么当然也可以获取到对方发送给你的消息了。

/*** 初始化聊天消息监听*/public void initListener() {ChatManager manager = ChatManager.getInstanceFor(connection);//设置信息的监听final ChatMessageListener messageListener = new ChatMessageListener() {@Overridepublic void processMessage(Chat chat, Message message) {//当消息返回为空的时候,表示用户正在聊天窗口编辑信息并未发出消息if (!TextUtils.isEmpty(message.getBody())) {//message为用户所收到的消息}}};ChatManagerListener chatManagerListener = new ChatManagerListener() {@Overridepublic void chatCreated(Chat chat, boolean arg1) {chat.addMessageListener(messageListener);}};manager.addChatListener(chatManagerListener);}

六:添加一个好友与好友请求监听

/*** 添加好友** @param user帐号* @param nickName 昵称* @param groupName 组名*/Roster.getInstanceFor(connection).createEntry("azhon@10.104.179.23", "", null);/*** 添加好友请求信息监听*/public void addFriendListener() {//条件过滤StanzaFilter filter = new AndFilter();StanzaListener listener = new StanzaListener() {@Overridepublic void processPacket(Stanza packet) throws SmackException.NotConnectedException {DiscoverInfo p = (DiscoverInfo) packet;//p中可以得到对方的信息if (p.getType().toString().equals("subscrib")) {//好友申请} else if (p.getType().toString().equals("subscribed")) {//通过了好友请求} else if (p.getType().toString().equals("unsubscribe")) {//拒绝好友请求}}};connection.addAsyncStanzaListener(listener, filter);}

下面就是本人实现的一个大概聊天界面,勉强实现了一个单聊功能。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。