xmppsmackandroid
① android中 的xmpp連接伺服器總是出非法狀態異常異常是怎麼回事
04-24 00:51:37.885: W/System.err(329): java.lang.IllegalStateException: Not connected to server.
04-24 00:51:37.885: W/System.err(329): at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:488)
04-24 00:51:37.885: W/System.err(329): at org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:69)
04-24 00:51:37.895: W/System.err(329): at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:353)
04-24 00:51:37.895: W/System.err(329): at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:230)
04-24 00:51:37.895: W/System.err(329): at org.jivesoftware.smack.Connection.login(Connection.java:353)
04-24 00:51:37.895: W/System.err(329): at com.wxs.model.User.login(User.java:200)
04-24 00:51:37.895: W/System.err(329): at com.wechat.project.activity.LoginAcitivity$4$1.run(LoginAcitivity.java:78)
04-24 00:51:37.905: W/System.err(329): at java.lang.Thread.run(Thread.java:1096)
② android 用openfire做伺服器,smack來連接怎麼連接不上
給你個例子
連接類
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
public class Conn {
private static XMPPConnection connection = null ;
public static XMPPConnection getConnection(String domain)
throws XMPPException {
XMPPConnection connection = new XMPPConnection(domain);
connection.connect();
return connection;
}
public static XMPPConnection getConnection(String domain, int port)
throws XMPPException {
if(connection==null){
ConnectionConfiguration config = new ConnectionConfiguration(domain,port);
connection = new XMPPConnection(config);
connection.connect();
}
return connection;
}
}
測試類
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
public class Test2 {
public static boolean LongAccount(XMPPConnection connection,
String username, String password) {
try {
connection.login(username, password);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) throws XMPPException {
XMPPConnection connection = Conn.getConnection("192.168.1.117");
boolean t = LongAccount(connection, "[email protected]", "password");
System.out.println("t login =" + t);
if(t){
ChatManager chatmanager = connection.getChatManager();
//新建一個會話
Chat newChat = chatmanager.createChat("[email protected]", new MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.println("start me , Received from 【" + message.getFrom() + "】 message: " + message.getBody());
}
});
//發送消息
newChat.sendMessage("我是菜鳥");
}
}
轉載,僅供參考。
③ 如何實現消息推送功能
?可以用第三方軟體極光推送來實現。對於定製化需求較強的,或者想擁有自己推送平台的開發者,極光提供全功能的私有雲方案。極光推送快速開始步驟: 1、到極光推送官方網站注冊開發者帳號;
2、登錄進入管理控制台,創建應用程序,得到 Appkey(SDK 與伺服器端通過 Appkey 互相識別);
3、在推送設置中給 Android 設置包名、給 iOS 上傳證書、啟用 WinPhone,根據你的需求進行選擇;
4、下載 SDK 集成到 App 里。
客戶端初始化 JPush 成功後,JPush 服務端會分配一個 Registration ID,作為此設備的標識(同一個手機不同 App 的 Registration ID 是不同的)。開發者可以通過指定具體的 Registration ID 來進行對單一設備的推送。
④ Android基於XMPP Smack openfire 開發的聊天室。怎麼讓創建者把聊天室刪除掉
只能告訴你方法了,查看xmpp協議說明
⑤ android消息推送GCM、XMPP、MQTT三種方案的優劣,越仔細越好,有具體分析更好!
android消息推送GCM、XMPP、MQTT三種方案的優劣:1、GCM服務(Google Cloud Messaging)優點:Google提供的服務、原生、簡單,無需實現和部署服務端。缺點:Android版本限制,該服務在國內不夠穩定、需要用戶綁定Google帳號,受限於Google。
2、XMPP協議(Openfire + Spark + Smack)優點:協議成熟、強大、可擴展性強、目前主要應用於許多聊天系統中,且已有開源的Java版的開發實例androidpn。缺點:協議較復雜、冗餘(基於XML)、費流量、費電,部署硬體成本高。
3、MQTT協議優點:協議簡潔、小巧、可擴展性強、省流量、省電,目前已經應用到企業領域,且已有C++版的服務端組件rsmb。缺點:不夠成熟、實現較復雜、服務端組件rsmb不開源,部署硬體成本較高。
d消息推送可以去了解一下極光,極光是個不錯的平台。極光緊密圍繞移動開發者需求,打造的開發者服務平台,可以提供一站式SaaS服務,通過全面覆蓋PC、手機、感測器、無線路由器等多種設備數據,打造全域數據平台。當前,不斷更新的SaaS產品及服務已深受國內百萬開發者的認可和信賴。
⑥ 如何在 aSmack xmpp 中創建組 android 嗎
您可以創建用戶組,
public boolean createGroup(XMPPConnection connection,String groupName) {
if (connection == null)
return false;
try {
connection.getRoster().createGroup(groupName);
Log.v("Group created : ", groupName);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
如果你踢在 xmpp 中創建分組聊天再試試下面的方法。(* * 未選中)
public class createMucAT extends AsyncTask<Void, Void, MultiUserChat> {
private RosterGroup group;
private Connection conn;
private String groupId;
private String groupName;
public createMucAT(Connection conn, RosterGroup group, String groupId,
String groupName) {
this.group = group;
this.conn = conn;
this.groupId = groupId;
this.groupName = groupName;
}
@Override
protected MultiUserChat doInBackground(Void... params) {
String groupTag = group.getName();
MultiUserChat chat = null;
try {
chat = createGroupChat(conn, groupId, groupTag, conn.getUser());
} catch (XMPPException e) {
e.printStackTrace();
}
return chat;
}
@Override
protected void onPostExecute(MultiUserChat result) {
super.onPostExecute(result);
//handle the result here
}
private MultiUserChat createGroupChat(Connection conn, String groupId, String groupName, String nickname) throws XMPPException {
MultiUserChat muc = new MultiUserChat(conn, groupId + "@" + ConnectionService.CONFERENCE_IP_ADDRESS);
muc.create(nickname);
Form form = muc.getConfigurationForm();
Form submitForm = form.createAnswerForm();
for (Iterator<FormField> fields = form.getFields(); fields.hasNext();) {
FormField field = (FormField) fields.next();
if (!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) {
submitForm.setDefaultAnswer(field.getVariable());
}
}
List<String> owners = new ArrayList<String>();
owners.add(ConnectionService.getConnection().getUser().toString());
submitForm.setAnswer("muc#roomconfig_roomowners", owners);
submitForm.setAnswer("muc#roomconfig_persistentroom", true);
submitForm.setAnswer("muc#roomconfig_roomdesc", groupName);
muc.sendConfigurationForm(submitForm);
return muc;
}
}
⑦ android使用smack要注意什麼
Smack是一個開源、易用的XMPP/Jabber客戶端庫,它使用Java語言開發,由Jive Software...最新的好消息是Smack在4.1.0版後將直接支持Android系統
⑧ android消息推送GCM、XMPP、MQTT三種方案的優劣是什麼
android消息推送GCM、XMPP、MQTT三種方案的優劣如下:1、GCM
(1)優點:提供的服務、原生、簡單,無需實現和部署的服務端。
(2)缺點:Android版本限制(必須大於2.2版本),該服務在國內不夠穩定、需要用戶綁定相關的Google帳號,而且只受限於Google。
2、XMPP
(1)優點:成熟、強大、可擴展也性強、目前主要應用於聊天系統中,且已有開源的Java版的開發實例androidpn。
(2)缺點:協議較復雜、冗餘(基於XML)、也比較費流量和費電,部署硬體成本高。
3、MQTT
(1)優點:簡潔、小巧、可擴展性強、是比較省流量、省電。目前已有C++版的服務端組件rsmb。
(2)缺點:不夠成熟、實現起來較復雜、服務端組件rsmb不開源,也是部署硬體成本較高。
消息推送軟體可以使用深圳極光的。極光成立於2011年;憑借領先的人工智慧及機器學習技術,極光將在APP消息推送、用戶增長與活躍等方面為客戶提供服務。
⑨ android 用openfire做伺服器,smack來連接怎麼連接不上
android客戶端接收 openfire 伺服器發送來的消息:
客戶端代碼如下:
Java代碼
packagecom.example.openfiretest;
importorg.jivesoftware.smack.Chat;
importorg.jivesoftware.smack.ChatManager;
importorg.jivesoftware.smack.ChatManagerListener;
importorg.jivesoftware.smack.ConnectionConfiguration;
importorg.jivesoftware.smack.MessageListener;
importorg.jivesoftware.smack.XMPPConnection;
importorg.jivesoftware.smack.packet.Message;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.view.Menu;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.Window;
importandroid.widget.CheckBox;
importandroid.widget.EditText;
importandroid.widget.Toast;
{
;
;
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
accountEditText=(EditText)findViewById(R.id.username);
passwordEditText=(EditText)findViewById(R.id.password);
findViewById(R.id.login).setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewv){
Stringaccount=accountEditText.getText().toString();
Stringpassword=passwordEditText.getText().toString();
if(account.equals("")||password.equals("")){
Toast.makeText(MainActivity.this,"賬號或密碼不能為空!",
Toast.LENGTH_SHORT).show();
}else{
ClientConServerccs=newClientConServer(MainActivity.this);
booleanb=ccs.login(account,password);
//如果登錄成功
if(b){
Toast.makeText(MainActivity.this,"登陸成功!",
Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,"登陸失敗!",
Toast.LENGTH_SHORT).show();
}
}
}
});
}
}
然後在登陸以後添加一個監聽消息的監聽器,用來監聽收到的消息(代碼89、90行):
Java代碼
packagecom.example.openfiretest;
importjava.util.Collection;
importorg.jivesoftware.smack.Chat;
importorg.jivesoftware.smack.ChatManager;
importorg.jivesoftware.smack.ChatManagerListener;
importorg.jivesoftware.smack.ConnectionConfiguration;
importorg.jivesoftware.smack.MessageListener;
importorg.jivesoftware.smack.Roster;
importorg.jivesoftware.smack.RosterEntry;
importorg.jivesoftware.smack.RosterGroup;
importorg.jivesoftware.smack.XMPPConnection;
importorg.jivesoftware.smack.XMPPException;
importorg.jivesoftware.smack.packet.Message;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Handler;
importandroid.util.Log;
importandroid.widget.Toast;
publicclassClientConServer{
privatestaticintPORT=5222;
privateContextcontext;
publicClientConServer(Contextcontext){
this.context=context;
}
//這里收到消息後,通過廣播將消息發送到需要的地方.哈哈,既然收到了伺服器發送來的信息,如何處理自己決定。
privateHandlerhandler=newHandler(){
publicvoidhandleMessage(android.os.Messagem){
Messagemsg=newMessage();
msg=(Message)m.obj;
//把從伺服器獲得的消息通過廣播發送
Intentintent=newIntent("org.yhn.mes");
String[]message=newString[]{
msg.getFrom(),
msg.getBody()};
System.out.println("==========收到伺服器消息From==========="+message[0].toString());
System.out.println("==========收到伺服器消息Body==========="+message[1].toString());
intent.putExtra("message",message);
context.sendBroadcast(intent);
};
};
publicbooleanlogin(Stringa,Stringp){
ConnectionConfigurationconfig=newConnectionConfiguration("192.168.0.124",PORT);
/**是否啟用安全驗證*/
config.setSASLAuthenticationEnabled(false);
/**是否啟用調試*/
//config.setDebuggerEnabled(true);
/**創建connection鏈接*/
XMPPConnectionconnection=newXMPPConnection(config);
try{
/**建立連接*/
connection.connect();
/**登錄*/
connection.login(a,p);
/**開啟讀寫線程,並加入到管理類中*/
//ClientSendThreadcst=newClientSendThread(connection);
//cst.start();
//ManageClientThread.addClientSendThread(a,cst);
//獲取用戶組、成員信息。
System.out.println("======開始獲取組及用戶==========");
Rosterroster=connection.getRoster();
Collection<RosterGroup>entriesGroup=roster.getGroups();
System.out.println("組的個數:"+entriesGroup.size());
for(RosterGroupgroup:entriesGroup){
Collection<RosterEntry>entries=group.getEntries();
System.out.println("=========groupName==="+group.getName());
for(RosterEntryentry:entries){
//Presencepresence=roster.getPresence(entry.getUser());
//Log.i("---","user:"+entry.getUser());
System.out.println("組成員名字:"+entry.getName());
//Log.i("---","tyep:"+entry.getType());
//Log.i("---","status:"+entry.getStatus());
//Log.i("---","groups:"+entry.getGroups());
}
}
System.out.println("======結束獲取組及用戶==========");
//在登陸以後應該建立一個監聽消息的監聽器,用來監聽收到的消息:
ChatManagerchatManager=connection.getChatManager();
chatManager.addChatListener(newMyChatManagerListener());
returntrue;
}catch(XMPPExceptione){
e.printStackTrace();
}
returnfalse;
}
/**messagelistener*/
{
publicvoidchatCreated(Chatchat,booleanarg1){
chat.addMessageListener(newMessageListener(){
publicvoidprocessMessage(Chatarg0,Messagemsg){
/**通過handler轉發消息*/
android.os.Messagem=handler.obtainMessage();
m.obj=msg;
m.sendToTarget();
}
});
}
}
}
啟動android客戶端,進行登錄
然後在openfire的管理控制台,會話-工具中發送消息給所有在線用戶
即可看到列印信息:在管理控制台發送的消息
⑩ Android 基於XMPP Smack Openfire 小結怎麼解決
首先第一、與伺服器建立好連接
關鍵代碼:127.0.0.1為伺服器IP,5222為伺服器埠號
[java] view plain 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 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 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 print?
/**
* 修改密碼
* @param connection
* @return
*/
public static boolean changePassword(XMPPConnection connection,String pwd)
{
try {
connection.getAccountManager().changePassword(pwd);
return true;
} catch (Exception e) {
return false;
}
}