XMPP是目前主流的一款及时通信协议,其以支持XML流传出具有较强的扩展性。

摘抄:
XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上。借助于>XML易于解析和阅读的特性,使得XMPP的协议能够非常漂亮。
XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的,与其他业已得到广泛使>用的即时通讯协议,诸如AIM,QQ等有功能完整,完善等先进性。

smack是什么?

smack是一款封装了XMPP协议的开源的客户端类库,其功能强大,使用简单,实现客户端之间收发信息只需要几行代码。

下载资源:
smack.jar: http://download.csdn.net/detail/wslwno1/9860909
客户端只需要在项目中加载smack的jar包即可。
我们知道即时通信是需要客户端和服务器的,现在客户端的资源我们有了,服务器的话这里本人在学习用的是openFire服务器。
openFire服务器下载:http://www.igniterealtime.org/downloads/index.jsp

下载安装或者解压后进入你的 盘符目录\Openfire\bin

双击打开启动服务器

点击Launch Admin打开OpenFire的后台管理配置基本信息

这里我已经配置过了所以界面如下,配置的话很简单,傻瓜式next,但要注意的是,数据库那块的话请如果你需要配置自己的数据库就直接next,像我这种小白,我选择的是openfire默认嵌入式的数据库。

到这里你已经配置好服务器了,可以在用户/组这一栏去添加用户或者群组

下面是客户端代码的编写:
通过XMPPConnection连接服务器


这里是简单的代码实现,如果读者有好见解欢迎交流学习:
public class XmppUtil {//配置文件  参数(服务地地址,端口号,域)private static ConnectionConfiguration configuration;private static XMPPConnection conn;/*** 初始化XMpp*/private static void initXmpp() {new Thread(new Runnable() {@Overridepublic void run() {try {//设置连接主机的ip与端口configuration = new ConnectionConfiguration("192.168.1.103", 5222);//设置不需要SAS验证configuration.setSASLAuthenticationEnabled(false);//开启调试模式configuration.setDebuggerEnabled(true);//设置安全类型configuration.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);// 设置登录状态为离线
//            configuration.setSendPresence(false);// 断网重连configuration.setReconnectionAllowed(true);//建立连接conn = new XMPPConnection(configuration);//连接conn.connect();Log.e("init", "run: 链接成功");} catch (XMPPException e) {e.printStackTrace();}}}).start();}public static XMPPConnection getConnection() {if (conn == null) {initXmpp();}return conn;}public static void closeConnection() {if (conn != null) {conn.disconnect();}}

调用api实现客户端登录


//这里为了写demo方便用了BufferKnift
public class LoginActivity extends AppCompatActivity {@BindView(R.id.username)TextView username;@BindView(R.id.edt_username)EditText edtUsername;@BindView(R.id.password)TextView password;@BindView(R.id.edt_password)EditText edtPassword;@BindView(R.id.login)Button login;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);ButterKnife.bind(this);}@OnClick(R.id.login)public void onViewClicked() {String username = edtUsername.getText().toString();String password = edtPassword.getText().toString();if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) {//这里是自己封装的工具类往下拉可以看到方法的实现boolean isLogin = ConnectionTool.login(username, password);if (isLogin) {Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_LONG).show();Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();UserInfo.mainJid = username;Log.d("login", "登录成功:" + isLogin);}else{Toast.makeText(LoginActivity.this,"登录失败",Toast.LENGTH_LONG).show();}}}
}
//ConnectionTool.login(username, password)方法实现/*** 登录* @param userName 用户名* @param password 密码* @return*/public static boolean login(String userName, String password) {try {if (XmppUtil.getConnection() != null) {SASLAuthentication.supportSASLMechanism("PLAIN", 0);XmppUtil.getConnection().login(userName, password);return true;}} catch (XMPPException e) {e.printStackTrace();return false;}return false;}

获取联系人列表

private void initData() {/**这里XmppUtil.getConnection()是之前封装的连接获取XMPPConnection*Roster 是获取联系人的花名册,拿到你的好友列表*这里的代码都是简单实现主要在于看懂和基本的会用。*高质量代码的话还是根据大家习惯了。*/Roster roster = XmppUtil.getConnection().getRoster();mList = new ArrayList<>();for (RosterEntry enty:roster.getEntries()){mList.add(enty);}mUsersAdapter = new UsersAdapter();userlist.setAdapter(mUsersAdapter);}

实现P2P消息收发

//这里做个解释:
//收发消息需要的关键类有://ChatManager:聊天管理者主要负责跟踪所有当前聊天记录
//Chat:聊天对象用于两个用户之间发送消息
//Message :主要用于封装我们要发送的消息
//MessageListener:消息监听器,主要用于监听我们收发消息public class ImP2PActivity extends AppCompatActivity {@BindView(R.id.send_edt)EditText sendEdt;@BindView(R.id.send_btn)Button sendBtn;@BindView(R.id.send_layout)RelativeLayout sendLayout;@BindView(R.id.im_list)ListView imList;String mNickName;String mJid;Chat mChat;List<Map<String, String>> mMessages;ImAdapter imAdapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_p2p);ButterKnife.bind(this);mMessages = new ArrayList<>();mNickName = getIntent().getStringExtra("nickName");mJid = getIntent().getStringExtra("jid");new Thread(new Runnable() {@Overridepublic void run() {ChatManager chatManager = XmppUtil.getConnection().getChatManager();mChat = chatManager.createChat(mJid, imMessageListener);}}).start();imAdapter = new ImAdapter();imList.setAdapter(imAdapter);}@OnClick(R.id.send_btn)public void onViewClicked() {try {//封装要发送的消息Message msg = new Message();//设置发送者msg.setFrom("admin@www.tommy.com");//设置消息实体就是我们要发送的内容msg.setBody(sendEdt.getText().toString());//设置发给谁msg.setTo(mJid);//发送选修mChat.sendMessage(msg);Map<String, String> map = new HashMap<String, String>();map.put("body", msg.getBody());map.put("from", msg.getFrom());mMessages.add(map);imAdapter.notifyDataSetChanged();imList.setSelection(mMessages.size()-1);} catch (XMPPException e) {e.printStackTrace();Log.i("im", "消息发送失败");}}ImMessageListener imMessageListener = new ImMessageListener();/***消息监听器**/class ImMessageListener implements MessageListener {@Overridepublic void processMessage(Chat chat, final Message message) {final String body = message.getBody();runOnUiThread(new Runnable() {@Overridepublic void run() {Log.e("im", "run: " + body);Map<String, String> map = new HashMap<String, String>();map.put("body", body);map.put("from", message.getFrom());mMessages.add(map);imAdapter.notifyDataSetChanged();imList.setSelection(mMessages.size()-1);
//                    Toast.makeText(ImP2PActivity.this, body, Toast.LENGTH_LONG).show();}});}}class ImAdapter extends BaseAdapter {@Overridepublic int getCount() {return mMessages.size();}@Overridepublic Object getItem(int position) {return mMessages.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder v = null;if (convertView == null) {convertView = View.inflate(ImP2PActivity.this, R.layout.item_im, null);v = new ViewHolder(convertView);} else {v = (ViewHolder) convertView.getTag();}Map<String, String> map = mMessages.get(position);if (!"admin@www.tommy.com".equals(map.get("from"))) {v.leftLayout.setVisibility(View.VISIBLE);v.rightLayout.setVisibility(View.GONE);v.name.setText(mNickName);v.content.setText(map.get("body"));} else {v.leftLayout.setVisibility(View.GONE);v.rightLayout.setVisibility(View.VISIBLE);v.myname.setText("我");v.mycontent.setText(map.get("body"));}return convertView;}class ViewHolder {@BindView(R.id.logo)ImageView logo;@BindView(R.id.name)TextView name;@BindView(R.id.content)TextView content;@BindView(R.id.left_layout)RelativeLayout leftLayout;@BindView(R.id.mylogo)ImageView mylogo;@BindView(R.id.myname)TextView myname;@BindView(R.id.mycontent)TextView mycontent;@BindView(R.id.right_layout)RelativeLayout rightLayout;ViewHolder(View view) {ButterKnife.bind(this, view);view.setTag(this);}}}
}

本人占时只了解了这些,此博客未完待续,本人会继续努力为大家分享更多的博客
大家对博客有什么建议可以留言交流,谢谢大家

XMPP学习(一)smack类库的使用及XMPP的了解相关推荐

  1. Smack类库最好的学习资料

    即时通讯系列阅读 即时通讯基础 即时通讯:XMPP基础 即时通讯:XMPP项目实践-微聊 Smack类库最好的学习资料 1. 登陆IM Connection.DEBUG_ENABLED = true; ...

  2. java xmpp openfire_Openfire/XMPP学习之——一个简单的Smack样例

    昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之--Openfire的安装.配置. Smack是一个开源, ...

  3. java smack jar_Smack:一个开源的XMPP用于即时通讯的客户端类库

    原标题:Smack:一个开源的XMPP用于即时通讯的客户端类库 本资源由 伯乐在线- oneDay整理,您也想贡献一份力量?欢迎加入我们 » Smack是一个用于和XMPP服务器通信的类库,可以实现即 ...

  4. Smack类库详细介绍

    Smack 是一个为使用 XMPP 服务器聊天和发送即时消息交流而提供的库. Smack的主要优势: l           使用简单且拥有强大的API.向用户发送一条文本消息只需用一下三行代码即可完 ...

  5. XMPP客户端库Smack 4.0.6版开发之三

    XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 六.建立连接的例子 XMPPConnection类用于创 ...

  6. 基于xmpp openfire smack开发之smack类库介绍和使用[2]

    关于Smack编程库,前面我们提到,它是面向Java端的api,主要在PC上使用,利用它我们可以向openfire服务器注册用户,发送消息,并且可以通过监听器获得此用户的应答消息,以及构建聊天室,分组 ...

  7. Android之基于xmpp openfire smack开发之smack类库介绍和使用[2]

    http://blog.csdn.net/shimiso/article/details/8816540 关于Smack编程库,前面我们提到,它是面向Java端的api,主要在PC上使用,利用它我们可 ...

  8. XMPP学习——2、用户登录

    最近在学习XMPP的使用,打算完成一个完整较为完整地Demo示例,通过这个示例掌握xmpp的使用与开发.同时打算在这个示例中学习使用一下其他的开源类库,在此作为记录学习. 包括服务器端--Openfi ...

  9. 学习 python ORM 类库 SQLAlchemy 使用

    具体ORM的详细说明可以看 这里http://baike.baidu.com/view/197951.htm ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据. 传达性:数据库结构被任何人 ...

最新文章

  1. git log 查看提交记录,参数:
  2. 在iOS 中使用sleep方法 让程序暂停几秒钟
  3. 使用Python进行科学计算:NumPy入门
  4. MCMC笔记:MCMC的不足
  5. 4月02日 提取汉字首字母,并大写的类
  6. Java IO(二)——RandomAccessFile
  7. 如何将网页部署到maven_如何通过Rultor将Maven工件部署到CloudRepo
  8. 十六进制表示_教资信息技术之:十进制(正数)转二进制、八进制、十六进制...
  9. windows 安装mongodb
  10. 科大讯飞刘聪:如何持续保持语音识别技术的领先
  11. 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算
  12. 深入解读Docker底层技术Cgroup
  13. 如何实现与硅谷技术零距离
  14. Selenium实现网页自动签到的Python脚本-win11
  15. Struts2框架之文件下载
  16. Java程序员的重启人生-3.Java基础碾压
  17. 一张图看懂阿里云ACK
  18. Android面试题(五)性能优化·1
  19. 如何利用实验室信息管理系统LIMS轻松通过CNAS评审?
  20. 深圳09年各行薪水大全

热门文章

  1. 持续集成平台Jenkins:docker镜像升级
  2. SGU 103 Traffic Lights(最短路)
  3. 社区活动|Pulsar 2.8.0 Release Party 北京站来啦!
  4. scp 传送数据的几种方式
  5. 跟幼师谈恋爱什么梗_跟幼师谈恋爱如何幽默聊天 偶尔向她撒个娇
  6. css3 keyframes 取消动画,为什么我的CSS3动画使用@keyframes在每个百分比范围内停止几毫秒?...
  7. ipad下载MathType链接
  8. Cisco line vty 0 4命令,远程管理交换机
  9. HDU-5927-Auxiliary Set(树上DP+xjb操作)
  10. 8项技能9种武器 打造企业增长黑客