android 基于xmpp开发android xmpp即时通讯讯时 发送消息的限制

需求发布后1小时内收到服务商响应每个需求平均有10个服务商参与95%以上的需求得到了圆满解决所有需求不向雇主和服务商收取任何佣金年货包装设计特价,企业送礼倍有面儿
匹配服务商
选择服务商,签单
服务商工作
验收工作,满意后付款
参与报价,开始赚钱
提交你的报价和方案
中标后交付作品
获得任务赏金Android基于Openfire开发即时通讯工具(1)搭建openfire服务器 - 手机系统 - 编程入门网
Android基于Openfire开发即时通讯工具(1)搭建openfire服务器
采用openfire作为服务器,这样不需要再写一个服务器,会节省不少事情,openfire经过简单的配置就可以实现一个通信服务器的基本功能,
采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。
一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。
是即时通信客户端编程库
smack的优点
1:Smack是一个简单的,功能强大的类库。
2:不会强迫你向其他类库那样,在信息包层面进行编码。它提供了更加智能化的类比如Chat和Groups,能使你的工作更富效率。
3:不需要你熟悉XMPP XML格式,甚至是XML格式。
4:易于实现机-机对话。
5:Apace License下的开源软件。你可以把它用于你的商业或非商业应用程序。
现在先来看看openfire服务器的搭建,
在官网上下载openfire后,解压,打开bin目录中的openfire.exe,点击launch admin,打开openfire管理控制台,第一次进入会出现配置界面,
因为只实现简单功能,服务器暂时不做复杂配置。所以数据库选择openfire自带的轻松一扫,精彩不停
15天担保期Android平台下基于XMPP的IM研究_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Android平台下基于XMPP的IM研究
来源:Linux社区&
作者:liuhongwei123888
由于项目需要做一个基于XMPP协议的通讯软件。故开始研究XMPP
XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议——Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段。
为了防止服务器间发送的数据被篡改或偷听,XMPP服务器通信引入了TLS机制,使用TLS机制能实现数据的加密,从而保证了在数据传输过程种数据的安全。
一个XMPP实体的地址称为Jabber Identifier或JID,作用类似于IP地址。一个合法的JID包括节点名,域名资源名,其格式为:jid=[node'@']domain['/'resource]
XMPP协议的命名空间:jabber:iq:private& &-- 私有数据存储,用于本地用户私人设置信息,比如用户备注等。jabber:iq:conference &-- 一般会议,用于多个用户之间的信息共享jabber:x:encrypted&-- 加密的消息,用于发送加密消息jabber:x:expire&&-- 消息终止jabber:iq:time&&-- 客户端时间jabber:iq:auth&&-- 简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证jabber:x:roster&&-- 内部花名册jabber:x:signed&&-- 标记的在线状态jabber:iq:search&-- 用户数据库查询,用于向服务器发送查询请求jabber:iq:register&-- 注册请求,用于用户注册相关信息jabber:x:iq:roster&-- 花名册管理jabber:x:conference&-- 会议邀请,用于向参加会议用户发送开会通知jabber:x:event&&-- 消息事件vcard-temp&&-- 临时的vCard,用于设置用户的头像以及昵称等
在网上找了下,有开源的项目BEEM,开源的用于android的xmpp框架asmack,asmack是smack的android版本。现在开始学习smack
。Xmpp就是神马东西,就不废话了。首先在网上下一个Openfire和Spack,不知道这两个是什么东西,就直接google吧。安装openfire需要mysql的支持,当然,,sqlserver肯定是可以的。还是先上图吧:&
Openfire + Spark + MyXMPPP
import&java.io.InputStreamR&&
import&java.util.C&&
import&org.jivesoftware.smack.C&&
import&org.jivesoftware.smack.ChatM&&
import&org.jivesoftware.smack.ChatManagerL&&
import&org.jivesoftware.smack.ConnectionC&&
import&org.jivesoftware.smack.MessageL&&
import&org.jivesoftware.smack.PrivacyListM&&
import&org.jivesoftware.smack.R&&
import&org.jivesoftware.smack.RosterE&&
import&org.jivesoftware.smack.RosterG&&
import&org.jivesoftware.smack.RosterL&&
import&org.jivesoftware.smack.XMPPC&&
import&org.jivesoftware.smack.packet.M&&
import&org.jivesoftware.smack.packet.P&&
public&class&TestSmack&{&&
&&&&public&static&void&main(String[]&args)&{XMPPConnection.DEBUG_ENABLED&=&true;&&
&&&&&&&&&&
&&&&&&&&final&ConnectionConfiguration&connectionConfig&=&new&ConnectionConfiguration("10.16.25.91",&<FONT color=#c,&"");&&
&&&&&&&&connectionConfig.setSASLAuthenticationEnabled(false);&&
&&&&&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&XMPPConnection&connection&=&new&XMPPConnection(connectionConfig);&&
&&&&&&&&&&&&&&&&&&&&connection.connect();&&
&&&&&&&&&&&&&&&&&&&&connection.login("test",&"test");&&
&&&&&&&&&&&&&&&&&&&&System.out.println(connection.getUser());&&
&&&&&&&&&&&&&&&&&&&&ChatManager&chatmanager&=&connection.getChatManager();&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&Chat&newChat&=&chatmanager.createChat("test3@pc",&new&MessageListener()&{&&
&&&&&&&&&&&&&&&&&&&&&&&&public&void&processMessage(Chat&chat,&Message&message)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("Received&from&【"&+&message.getFrom()&+&"】&message:&"&+&message.getBody());&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&});&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&chatmanager.addChatListener(new&ChatManagerListener()&{&&
&&&&&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&&&&&public&void&chatCreated(Chat&chat,&boolean&createdLocally)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&chat.addMessageListener(new&MessageListener()&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&void&processMessage(Chat&chat,&Message&message)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("Received&from&【"&+&message.getFrom()&+&"】&message:&"&+&message.getBody());&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&});&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&});&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&newChat.sendMessage("我是菜鸟");&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&Roster&roster&=&connection.getRoster();&&
&&&&&&&&&&&&&&&&&&&&Collection&RosterEntry&&entries&=&roster.getEntries();&&
&&&&&&&&&&&&&&&&&&&&for(RosterEntry&entry&:&entries)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&System.out.print(entry.getName()&+&"&-&"&+&entry.getUser()&+&"&-&"&+&entry.getType()&+&"&-&"&+&entry.getGroups().size());&&
&&&&&&&&&&&&&&&&&&&&&&&&Presence&presence&=&roster.getPresence(entry.getUser());&&
&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("&-&"&+&presence.getStatus()&+"&-&"+&presence.getFrom());&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&roster.addRosterListener(new&RosterListener()&{&&
&&&&&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&&&&&public&void&entriesAdded(Collection&String&&addresses)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("entriesAdded");&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&&&&&public&void&entriesUpdated(Collection&String&&addresses)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("entriesUpdated");&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&&&&&public&void&entriesDeleted(Collection&String&&addresses)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("entriesDeleted");&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&&&&&public&void&presenceChanged(Presence&presence)&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("presenceChanged&-&&"&+&presence.getStatus());&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&});&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&for(RosterGroup&g&:&roster.getGroups())&{&&
&&&&&&&&&&&&&&&&&&&&&&&&for(RosterEntry&entry&:&g.getEntries())&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("Group&"&+g.getName()&+"&&&&"&+&entry.getName()&+&"&-&"&+&entry.getUser()&+&"&-&"&+&entry.getType()&+&"&-&"&+&entry.getGroups().size());&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&BufferedReader&cmdIn&=&new&BufferedReader(new&InputStreamReader(System.in));&&
&&&&&&&&&&&&&&&&&&&&while(true)&{&&
&&&&&&&&&&&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&String&cmd&=&cmdIn.readLine();&&
&&&&&&&&&&&&&&&&&&&&&&&&&if("!q".equalsIgnoreCase(cmd))&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;&&
&&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&&&&newChat.sendMessage(cmd);&&
&&&&&&&&&&&&&&&&&&&&&&}catch(Exception&ex)&{&&
&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&connection.disconnect();&&
&&&&&&&&&&&&&&&&&&&&System.exit(0);&&
&&&&&&&&&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&&&&&&&&&}&&
以上代码如果在一般的Java Project上运行需要加入smack.jar&和klmx2.jar,如果是Android Project,基本代码不需改变只需将其放入onCreate(...)方法下即可,需要加入asmack.jar包.
1、ConnectionConfiguration&作为用于与XMPP服务建立连接的配置。它能配置;连接是否使用TLS,SASL加密。&包含内嵌类:ConnectionConfiguration.SecurityMode
2、XMPPConnection.&XMPPConnection这个类用来连接XMPP服务.&可以使用connect()方法建立与服务器的连接。disconnect()方法断开与服务器的连接. &在创建连接前可以使用XMPPConnection.DEBUG_ENABLED = 使开发过程中可以弹出一个GUI窗口,用于显示我们的连接与发送Packet的信息。
3、ChatManager&用于监控当前所有chat。可以使用createChat(String userJID, MessageListener listener)创建一个聊天。&4、Chat&Chat用于监控两个用户间的一系列message。使用addMessageListener(MessageListener listener)当有任何消息到达时将会触发listener的processMessage(Chat chat, Message message) 方法.&我们可以使用sendMessage()发送消息,这个方法有两个重载方法,一种类类型的参数时String类型,另一种则是传入Message对象(后面介绍)。&那么有这样一种情况,当别人主动跟我们建立连接发送消息,或者系统发送消息时我们怎么才能接收消息呢?&&& 我现在是这样操作的:&chatmanager.addChatListener(new ChatManagerListener() {&&@Override&&public void chatCreated(Chat chat, boolean createdLocally) {&&&chat.addMessageListener(new MessageListener() {&&&&@Override&&&&public void processMessage(Chat chat, Message message) {&&&&&System.out.println("Received message: " + message.getBody());&&&&}&&&&&&&&&&&&});&&}&});&5、Message&Message用于表示一个消息包(可以用调试工具看到发送包和接收包的具体内容)。它有以下多种类型。&&Message.Type.NORMAL -- (默认)文本消息(比如邮件)&&Message.Type.CHAT&--&典型的短消息,如QQ聊天的一行一行显示的消息&&Message.Type.GROUP_CHAT&--&群聊消息&&Message.Type.HEADLINE&--&滚动显示的消息&&Message.TYPE.ERROR&--&错误的消息&Message有两个内部类:&&Message.Body -- 表示消息体&&Message.Type -- 表示消息类型&6、Roster&表示存储了很多RosterEntry的一个花名册.为了易于管理,花名册的项被分贝到了各个group中.&当建立与XMPP服务的连接后可以使用connection.getRoster()获取Roster对象。&别的用户可以使用一个订阅请求(相当于QQ加好友)尝试订阅目的用户。可以使用枚举类型Roster.SubscriptionMode的值处理这些请求:&accept_all: 接收所有订阅请求&reject_all:拒绝所有订阅请求&manual: &手工处理订阅请求&&创建组:RosterGroup group = roster.createGroup("大学");&向组中添加RosterEntry对象: group.addEntry(entry);&7、RosterEntry&表示Roster(花名册)中的每条记录.它包含了用户的JID,用户名,或用户分配的昵称.&8、RosterGroup&表示RosterEntry的组。可以使用addEntry(RosterEntry entry)添加。contains(String user) 判断某用户是否在组中.当然removeEntry(RosterEntry entry)就是从组中移除了。getEntries()
获取所有RosterEntry.&9、Presence&表示XMPP状态的packet。每个presence packet都有一个状态。用枚举类型Presence.Type的值表示:&available -- (默认)用户空闲状态&unavailable -- 用户没空看消息 &subscribe -- 请求订阅别人,即请求加对方为好友 &subscribed -- 统一被别人订阅,也就是确认被对方加为好友 &unsubscribe -- 他取消订阅别人,请求删除某好友&unsubscribed -- 拒绝被别人订阅,即拒绝对放的添加请求 &error -- 当前状态packet有错误&内嵌两个枚举类型:Presence.Mode和Presence.Type.&可以使用setStatus自定义用户当前的状态(像QQ一样的)
相关资讯 & & &
& (07/24/:27)
& (12/03/:39)
& (02/10/:30)
& (08/17/:30)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
匿名 发表于 可以把源码发到我的邮箱吗
(0) 匿名 发表于 可不可以给发个源码?tjf_谢谢了
(0) carry 发表于 有源代码么?
可以发到我邮箱
谢谢啦!!
(0) carry 发表于 可以把源码发到我的邮箱给我学习学习么?
我的邮箱是
谢谢啦!!
(0) 天啊名字真难 发表于 gfd

我要回帖

更多关于 xmpp即时通讯demo 的文章

 

随机推荐