[英]XMPP Smack can not receive the message
我閱讀了許多有關如何通過smack 4.1和openFire發送和接收消息的相關文章。 據我了解,我實現了以下代碼
我可以連接,我可以登錄。 但是當從user1向user2發送消息時,我什么也沒得到。
碼:
package passargad.ehsan;
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.chat.Chat;
import org.jivesoftware.smack.chat.ChatManager;
import org.jivesoftware.smack.chat.ChatManagerListener;
import org.jivesoftware.smack.chat.ChatMessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import java.io.IOException;
public class XMPPservice extends Service {
XMPPTCPConnection connection;
String connectionMessages="";
ConnectionXMPP connectionXMPPAsynch =new ConnectionXMPP();
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try {
connectionXMPPAsynch.execute();
}
catch (Exception e)
{
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
class ConnectionXMPP extends AsyncTask<String,Void,String>
{
@Override
protected String doInBackground(String... params) {
connection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder()
.setServiceName("192.168.1.6").setUsernameAndPassword("ehsan", "123")
.setPort(9090).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setCompressionEnabled(false).build());
connection.setUseStreamManagement(true);
connection.addConnectionListener(new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
Log.d("connected", "yes connected successfully : ");
}
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
Log.d("connected","yes authenticated successfully : ");
}
@Override
public void connectionClosed() {
Log.d("connected","yes connectionClosed successfully : ");
}
@Override
public void connectionClosedOnError(Exception e) {
Log.d("connected","yes connectionClosedOnError : ");
connectionMessages="connectionClosedOnError";
publishProgress();
}
@Override
public void reconnectionSuccessful() {
Log.d("connected","yes reconnection successfully : ");
}
@Override
public void reconnectingIn(int seconds) {
Log.d("connected","yes reconnectingIn : ");
}
@Override
public void reconnectionFailed(Exception e) {
Log.d("connected","yes reconnectionFailed : ");
}
});
connect();
chat();
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
if (connectionMessages=="connectionClosedOnError")
{
connect();
}
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("","onPostExecute");
}
private void connect()
{
try {
connection.connect();
connection.login();
Log.d(""," user id :: " + connection.getUser());
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
}
}
private void chat()
{
ChatManager chatmanager = ChatManager.getInstanceFor(connection);
Chat newChat = chatmanager.createChat("192.168.1.6" ,new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
Log.d("","message :"+ message.getBody());
}
});
try
{
Message newMessage = new Message();
newMessage.setBody("Howdy!");
newMessage.setFrom("ehsan@192.168.1.6/Smack");
newMessage.setTo("ehsan@192.168.1.6/Smack");
newChat.sendMessage(newMessage);
}
catch (SmackException.NotConnectedException e)
{
e.printStackTrace();
}
chatmanager.addChatListener(
new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally)
{
if (!createdLocally)
chat.addMessageListener(new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
Log.d("","message :"+ message.getBody());
}
});;
}
});
}
}
}
這是logcat:
02-20 06:45:13.334 1188-1188 / passargad.ehsan I / dalvikvm:無法從方法android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityEvent引用的方法android.view.ViewGroup.onInitializeAccessibilityEvent\n 02-20 06:45:13.334 1188-1188 / passargad.ehsan W / dalvikvm:VFY:無法解析虛擬方法13351:Landroid / view / ViewGroup; .onInitializeAccessibilityEvent(Landroid / view / accessibility / AccessibilityEvent;)V\n 02-20 06:45:13.334 1188-1188 / passargad.ehsan D / dalvikvm:VFY:在0x0006處替換操作碼0x6f\n 02-20 06:45:13.334 1188-1188 / passargad.ehsan D / dalvikvm:VFY:Landroid / support / v7 / widget / LinearLayoutCompat; .onInitializeAccessibilityEvent(Landroid / view / view / accessibility / AccessibilityEvent;)V中的無效代碼0x0009-0011\n 02-20 06:45:13.344 1188-1188 / passargad.ehsan W / dalvikvm:VFY:找不到簽名中引用的類(Landroid / view / accessibility / AccessibilityNodeInfo;)\n 02-20 06:45:13.344 1188-1188 / passargad.ehsan I / dalvikvm:無法找到方法android.view.ViewGroup.onInitializeAccessibilityNodeInfo,該方法是從方法android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityNodeInfo引用的\n 02-20 06:45:13.344 1188-1188 / passargad.ehsan W / dalvikvm:VFY:無法解析虛擬方法13352:Landroid / view / ViewGroup; .onInitializeAccessibilityNodeInfo(Landroid / view / accessibility / AccessibilityNodeInfo;)V\n 02-20 06:45:13.344 1188-1188 / passargad.ehsan D / dalvikvm:VFY:在0x0006處替換操作碼0x6f\n 02-20 06:45:13.344 1188-1188 / passargad.ehsan D / dalvikvm:VFY:Landroid / support / v7 / widget / LinearLayoutCompat; .onInitializeAccessibilityNodeInfo(Landroid / view / view / accessibility / AccessibilityNodeInfo;)V中的無效代碼0x0009-0011\n 02-20 06:45:13.374 1188-1188 / passargad.ehsan I / KeyCharacterMap:沒有ID為-1的鍵盤\n 02-20 06:45:13.374 1188-1188 / passargad.ehsan I / KeyCharacterMap:使用默認鍵盤映射:/system/usr/keychars/qwerty.kcm.bin\n 02-20 06:45:13.504 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放206K,46%釋放3077K / 5639K,外部0K / 0K,暫停5ms + 11ms\n 02-20 06:45:16.858 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放263K,44%釋放3317K / 5895K,外部0K / 0K,暫停5ms + 6ms\n 02-20 06:45:17.088 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放252K,43%釋放3485K / 6087K,外部0K / 0K,暫停5ms + 6ms\n 02-20 06:45:17.208 1188-1199 / passargad.ehsan I / dalvikvm:找不到方法java.lang.Throwable.addSuppressed,從方法de.measite.minidns.Client.query引用\n 02-20 06:45:17.208 1188-1199 / passargad.ehsan W / dalvikvm:VFY:無法解析虛擬方法14707:Ljava / lang / Throwable; .addSuppressed(Ljava / lang / Throwable;)V\n 02-20 06:45:17.208 1188-1199 / passargad.ehsan D / dalvikvm:VFY:在0x006f處替換操作碼0x6e\n 02-20 06:45:17.208 1188-1199 / passargad.ehsan I / dalvikvm:找不到方法java.lang.Throwable.addSuppressed,從方法de.measite.minidns.Client.query引用\n 02-20 06:45:17.208 1188-1199 / passargad.ehsan W / dalvikvm:VFY:無法解析虛擬方法14707:Ljava / lang / Throwable; .addSuppressed(Ljava / lang / Throwable;)V\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan D / dalvikvm:VFY:在0x009d處替換操作碼0x6e\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan I / dalvikvm:找不到方法java.lang.Throwable.addSuppressed,從方法de.measite.minidns.Client.query引用\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan W / dalvikvm:VFY:無法解析虛擬方法14707:Ljava / lang / Throwable; .addSuppressed(Ljava / lang / Throwable;)V\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan D / dalvikvm:VFY:在0x00b4處替換操作碼0x6e\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan D / dalvikvm:VFY:Lde / measite / minidns / Client中的無效代碼0x0072-0072; .query(Lde / measite / minidns / Question; Ljava / lang /字符串; I)Lde / measite / minidns / DNSMessage;\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan D / dalvikvm:VFY:死代碼0x00a0-00a0 in Lde / measite / minidns / Client; .query(Lde / measite / minidns / Question; Ljava / lang /字符串; I)Lde / measite / minidns / DNSMessage;\n 02-20 06:45:17.218 1188-1199 / passargad.ehsan D / dalvikvm:VFY:死代碼0x00b7-00b7 in Lde / measite / minidns / Client; .query(Lde / measite / minidns / Question; Ljava / lang /字符串; I)Lde / measite / minidns / DNSMessage;\n 02-20 06:45:17.428 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放了273K,42%釋放了3647K / 6279K,外部0K / 0K,暫停了4ms + 6ms\n 02-20 06:45:17.688 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放了403K,44%釋放了3652K / 6407K,外部0K / 0K,暫停了5ms + 5ms\n 02-20 06:45:17.979 1188-1199 / passargad.ehsan D / connected:是已成功連接:\n 02-20 06:45:18.519 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放了323K,42%釋放了3739K / 6407K,外部0K / 0K,暫停了5ms + 6ms\n 02-20 06:45:18.669 1188-1193 / passargad.ehsan I / dalvikvm:Jit:將JitTable的大小從512調整為1024\n 02-20 06:45:18.779 1188-1193 / passargad.ehsan D / dalvikvm:OP_INSTANCE_OF中的空爵士樂,單步執行\n 02-20 06:45:19.460 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放479K,43%釋放3737K / 6535K,外部0K / 0K,暫停5ms + 6ms\n 02-20 06:45:20.221 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT釋放486K,43%釋放3742K / 6535K,外部0K / 0K,暫停5ms + 6ms\n 02-20 06:45:20.371 1188-1199 / passargad.ehsan D / connected:是已成功通過身份驗證:\n 02-20 06:45:20.391 1188-1199 / passargad.ehsan D /:用戶ID :: ehsan @ passargad-pc / Smack\n 02-20 06:45:20.411 1188-1188 / passargad.ehsan D /:onPostExecute
先感謝您!
快速瀏覽一下代碼,發現了一些錯誤:
createChat希望第一個參數是userJid(不是主機IP)
Chat newChat = chatmanager.createChat("ehsan@<service name>" ,new ChatMessageListener() { @Override public void processMessage(Chat chat, Message message) { Log.d("","message :"+ message.getBody()); } });
啟用調試並檢查日志
connection = new XMPPTCPConnection( XMPPTCPConnectionConfiguration.builder() .setServiceName("192.168.1.6") .setUsernameAndPassword("ehsan", "123") .setPort(9090) .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) .setCompressionEnabled(false) .setDebuggerEnabled(true) .build());
將端口從9090更改為5222(以防您未更改默認配置;請檢查openfire管理面板)
首選使用addAsyncStanzaListener
偵聽傳入的數據包。
我不確定這是否對您有幫助,但是可以通過以下代碼得到答復:
public void chat(String AddressedUser) throws NotConnectedException {
//Create username whom we want to send a message
String userToSend = AddressedUser + "@" + serverDomain;
ChatManager chatmanager = ChatManager.getInstanceFor(connection);
Chat newChat = chatmanager.createChat(userToSend , new MessageListener() {
@Override
public void processMessage(Chat chat, Message message ) {
// TODO Auto-generated method stub
System.out.println("Received message: " + message);
}
});
try {
newChat.sendMessage("Hello");
}
catch (XMPPException e) {
System.out.println("Error Delivering block");
}
}
該示例可能對您有用:
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.XMPPException;
import org.jivesoftware.smack.packet.Message;
public class Test {
public static void main(String args[]) throws XMPPException {
ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);
XMPPConnection connection = new XMPPConnection(config);
connection.connect();
connection.login("userx", "123456");
ChatManager cm = connection.getChatManager();
Chat chat = cm.createChat("tongqian@tsw-PC", null);
/*
* add listener
*/
cm.addChatListener(new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean create) {
chat.addMessageListener(new MessageListener() {
@Override
public void processMessage(Chat chat, Message msg) {
System.out.println(chat.getParticipant() + ":" + msg.getBody());
}
});
}
});
chat.sendMessage("hello");
while(true);
//connection.disconnect();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.