A. android端怎麼接收openfire伺服器發送過來的消息
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的管理控制台,會話-工具中發送消息給所有在線用戶
即可看到列印信息:在管理控制台發送的消息
B. Android如何開發即時通訊功能
sdk最簡單,自己搞可以根據XMPP協議,就是其他答案提到的openfire+asmack,但XMPP協議是基於xml的,冗長直接導致費流量費電,可以考慮在傳輸的時候自己加一層二進制協議
C. 如何android studio 導入asmack源碼
在asmack中有兩個非常重要的對象PacketReader和PacketWriter,那麼從類名上看Packet + (Reader/Wirter),而TCP/IP傳輸的數據,叫做Packet(包),asmack使用的是XMPP協議,XMPP簡單講就是使用TCP/IP協議 + XML流協議的組合。所以這個了對象的作用從字面上看應該是,寫包與讀包,作用為從服務端讀寫數據。如何android studio 導入asmack源碼
D. Android 中 實現兩個客戶端通過一個 PC服務端實現兩個客戶端之間的即時通訊怎麼做
擦 就是客戶端可以相互發消息唄…說的好復雜…
你可以用openFire+asmack 開源的 服務端是現成的,android端調用asmack api 即時通訊的基本功能都有 自己google下~
E. android消息推送怎麼實現
極光推送可以輕松實現android消息推送。具有操作步驟如下:F. android當伺服器發來了一條信息怎樣讓它在程序圖標上提示有新信息來了
消息推送可以實現。
所謂的消息推送就是從伺服器端向移動終端發送連接,傳輸一定的信息。比如一些新聞客戶端,每隔一段時間收到一條或者多條通知,這就是從伺服器端傳來的推送消息;還比如常用的一些IM軟體如微信、GTalk等,都具有伺服器推送功能。
推送方法如下:
1)通過SMS進行伺服器端和客戶端的交流通信。
在Android平台上,你可以通過攔截SMS消息並且解析消息內容來了解伺服器的意圖,可以實現完全的實時操作。但是問題是這個方案的成本相對比較高,且依賴於運營商。
2)循環主動定時獲取
這種方法需要客戶端來做一個定時或者周期性的訪問伺服器端介面,以獲得最新的消息。輪詢的頻率太慢可能導致某些消息的延遲,太快則會大量消耗網路帶寬和電池。
3)持久連接
這個方案可以解決由輪詢帶來的性能問題,但是還是會消耗手機的電池。我們需要開一個服務來保持和伺服器端的持久連接(蘋果就和谷歌的C2DM是這種機制)。但是對於Android系統,當系統可用資源較低,系統會強制關閉我們的服務或者是應用,這種情況下連接會強制中斷。(Apple的推送服務之所以工作的很好,是因為每一台手機僅僅保持一個與伺服器之間的連接,事實上C2DM也是這么工作的。即所有的推送服務都是經由一個代理伺服器完成的,這種情況下只需要和一台伺服器保持持久連接即可。C2DM=Cloud
to Device Messaging)。
相比之下第三種還是最可行的。為軟體編寫系統服務或開機啟動功能;或者如果系統資源較低,服務被關閉後可以在onDestroy ()方法裡面再重啟該服務,進而實現持久連接的方式。
C2DM內置於Android的2.2系統上,無法兼容老的1.6到2.1系統;且依賴於Google官方提供的C2DM伺服器,由於國內的網路環境,這個服務經常不可用。
建立在TCP協議之上的XMPP協議,不僅可提供可這種持久連接的功能,能實現伺服器和客戶機的雙工通信,還能不依賴與系統版本和google伺服器的限制,提供了比較好的解決方案。
2. XMPP協議
XMPP全稱Extensible Messaging and Presence
Protocol,前身是Jabber項目,是一種以XML為基礎的開放式即時通訊協議。XMPP因為被Google
Talk和網易泡泡應用而被廣大網民所接觸。XMPP的關鍵特色是,分散式的即時通訊系統,以及使用XML串流。XMPP目前被IETF國際標准組織完成了標准化工作。
Android push notification(androidpn)
是一個基於XMPP協議的java開源實現,它包含了完整的客戶端和伺服器端。該伺服器端基本是在另外一個開源工程openfire基礎上修改實現的。
androidpn客戶端需要用到一個基於java的開源XMPP協議包asmack,這個包同樣也是基於openfire下的另外一個開源項目smack,不過我們不需要自己編譯,可以直接把androidpn客戶端裡面的asmack.jar拿來使用。客戶端利用asmack中提供的XMPPConnection類與伺服器建立持久連接,並通過該連接進行用戶注冊和登錄認證,同樣也是通過這條連接,接收伺服器發送的通知。
androidpn伺服器端也是java語言實現的,基於openfire開源工程,不過它的Web部分採用的是spring框架,這一點與openfire是不同的。Androidpn伺服器包含兩個部分,一個是偵聽在5222埠上的XMPP服務,負責與客戶端的XMPPConnection類進行通信,作用是用戶注冊和身份認證,並發送推送通知消息。另外一部分是Web伺服器,採用一個輕量級的HTTP伺服器,負責接收用戶的Web請求。伺服器的這兩方式,意義非凡:當相應的TCP埠被防火牆封閉,可以使用輪詢的方式進行訪問,因此又有助於通過防火牆。
G. 基於Openfire+XMPP下通過asmack開發Android端的即時通訊APP方法與步奏
有相應的文檔和demo。文檔連接發泥私信了,具體demo其實也有現成的,用到的類有限不是很多。
H. 如何在 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;
}
}
I. android studio怎麼使用asmack.jar
工具/原料
Android Studio
可導入Android Studio的項目一個
方法/步驟
點擊啟動AndroidStudio,啟動後的界面如圖所示。
復制你需要添加的jar,並將其黏貼到app— —src— —main— —libs文件夾下,可運行的AndroidStudio項目都有像這樣的目錄結構。可以看到雖然jar已經復制黏貼過來了,但是還未導入,所以看不到jar中包含的內容。而已導入的jar,則可以看到jar中內容。
右鍵點擊新黏貼的jar,在彈出菜單中點擊Add As Library.
選擇你要導入到的那個mole(在AndroidStudio中相當於Eclipse中的project),如果當前只是一個項目,下拉框中除了app也沒有其他的內容,那麼直接點擊ok確認。
這樣jar就被添加到項目中來了。
J. 有誰知道怎麼用android的xmpp協議實現即時通信
1.com.way.service:這是本應用的最重要的包啦,為了簡單,本應用只用了一個服務,包括登陸、聊天、超時判斷以及連接等等,都是在此處處理。
2.com.way.smack:這里是對asmack第三方包重新包裝的一個工具包,方便本應用直接調用。
3.com.way.activity;理所當然就是所有Activity咯。
4.com.way.app:這里有一個廣播接受者和Application類,主要是用來接受系統廣播,比如說網路連接上或者斷開,開關機等等廣播。
5.com.way.db:沒錯,就是操作資料庫咯,總共是兩個ContentProvider,一個是存儲好友,一個是存儲聊天記錄。
6.其他的一些包大都是控制項或者工具類,為了方便自己下次使用以及大家直接到自己的項目中