openfire+smack中一个用户为什么收到别人添加请求之后会自动发送type="subscribed

openfire+smack中一个用户为什么收到别人添加请求之后会自动发送type="subscribed,第1张

openfire+smack中一个用户为什么收到别人添加请求之后会自动发送type="subscribed

android客户端接收 openfire 服务器发送来的消息: 客户端代码如下: Java代码 package com.example.openfiretestimport org.jivesoftware.smack.Chatimport org.jivesoftware.smack.ChatManagerimport org.jivesoftware.smack.ChatManage。

android客户端接收 openfire 服务器发送来的消息:

客户端代码如下:

Java代码

package com.example.openfiretest

import org.jivesoftware.smack.Chat

import org.jivesoftware.smack.ChatManager

import org.jivesoftware.smack.ChatManagerListener

import org.jivesoftware.smack.ConnectionConfiguration

import org.jivesoftware.smack.MessageListener

import org.jivesoftware.smack.XMPPConnection

import org.jivesoftware.smack.packet.Message

import android.os.Bundle

import android.os.Handler

import android.app.Activity

import android.content.Intent

import android.view.Menu

import android.view.View

import android.view.View.OnClickListener

import android.view.Window

import android.widget.CheckBox

import android.widget.EditText

import android.widget.Toast

iOS无法做到这一点,

因为IOS的应用程序并不知道自身是否被系统KILL掉,

比如,在好友KILL掉程序以后, 你依然无法知道他是否下线, 他的头像依然显示在线.

除非应用内有一个动作:退出登录, 并且用户通过点击"退出登录"来主动退出应用, 服务器才能得知他是否下线。

 首先第一、与服务器建立好连接

关键代码:127.0.0.1为服务器IP,5222为服务器端口号

[java] view plain copy print?

/**

* 连接服务器

*

* @return

*/

public boolean conServer() {

ConnectionConfiguration config = new ConnectionConfiguration(

127.0.0.1, 5222)

/** 是否启用安全验证 */

config.setSASLAuthenticationEnabled(false)

/** 是否启用调试 */

// config.setDebuggerEnabled(true)

/** 创建connection链接 */

try {

connection = new XMPPConnection(config)

/** 建立连接 */

connection.connect()

return true

} catch (XMPPException e) {

e.printStackTrace()

}

return false

}

第二、实现注册

关键代码:

以下代码注释都很清楚了,如有不懂的地方可以留言,这里就不多做解释了。

[java] view plain copy print?

/**

* 注册

*

* @param account 注册帐号

* @param password 注册密码

* @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败

*/

public String regist(String account, String password) {

if (connection == null)

return "0"

Registration reg = new Registration()

reg.setType(IQ.Type.SET)

reg.setTo(ClientConServer.connection.getServiceName())

reg.setUsername(account)// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。

reg.setPassword(password)

reg.addAttribute("android", "geolo_createUser_android")// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!!

PacketFilter filter = new AndFilter(new PacketIDFilter(

reg.getPacketID()), new PacketTypeFilter(IQ.class))

PacketCollector collector = ClientConServer.connection

.createPacketCollector(filter)

ClientConServer.connection.sendPacket(reg)

IQ result = (IQ) collector.nextResult(SmackConfiguration

.getPacketReplyTimeout())

// Stop queuing results

collector.cancel()// 停止请求results(是否成功的结果)

if (result == null) {

Log.e("RegistActivity", "No response from server.")

return "0"

} else if (result.getType() == IQ.Type.RESULT) {

return "1"

} else { // if (result.getType() == IQ.Type.ERROR)

if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {

Log.e("RegistActivity", "IQ.Type.ERROR: "

+ result.getError().toString())

return "2"

} else {

Log.e("RegistActivity", "IQ.Type.ERROR: "

+ result.getError().toString())

return "3"

}

}

}

第三、实现登录

关键代码: 代码很简单不做太多解释

[java] view plain copy print?

/**

* 登录

*

* @param a 登录帐号

* @param p 登录密码

* @return

*/

public boolean login(String a, String p) {

try {

if (connection == null)

return false

/** 登录 */

connection.login(a, p)

return true

} catch (Exception e) {

e.printStackTrace()

}

return false

}

第四、修改密码

关键代码:同样很简单

[java] view plain copy print?

/**

* 修改密码

* @param connection

* @return

*/

public static boolean changePassword(XMPPConnection connection,String pwd)

{

try {

connection.getAccountManager().changePassword(pwd)

return true

} catch (Exception e) {

return false

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11926040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存