2012-03-18 1 views
1

aSmack을 사용하여 채팅 응용 프로그램을 구현했습니다. 채팅 서버로 오픈 파이어 서버를 사용했습니다. 이러한 모든 응용 프로그램은 동일한 시스템에서 실행됩니다. 그러나 두 개의 에뮬레이터간에 메시지를 보내려고하면 하나의 에뮬레이터 만 성공적으로 메시지를 수신합니다. 다른 클라이언트는 메시지를 수신하지 않습니다. 그러나 두 에뮬레이터에서 나는 pigin (IM clinet)에게 메시지를 보낼 수있었습니다. 또한 gmail.com을 채팅 서버로 사용하면 모든 것이 올바르게 작동합니다. 이 suchith jayamal 로그인하는 데 사용하나의 Android 채팅 앱에서 메시지를받을 수 없습니다 (aSamck + Openfire)

사용자 이름 (elearn가 난 내 기계의 Openfire 사용하여 만든 도메인) 메시지를 suchith을 jayamal의 @의 elearn를 보내는 데 사용

이름 (의 Openfire이 표시는 사용자가 온라인) @ elearn

이 문제를 해결하는 데 도움이 바랍니다 (그러나의 Openfire 아카이브에서 그 이름에 메시지를 전송하는 시도했지만 역시 실패, jayamal의 @의 elearn/헤로인과 같은 하나의 이름이 표시됩니다). 귀하의 도움은 정말로 감사하겠습니다.

공용 클래스 ASmackChatTestActivity이 조금 늦었 활동 {

public int state = 0; 
private static final String TAG = "HelloFormStuffActivity"; 

XMPPConnection xmpp ; 




/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button btnLogin = (Button) findViewById(id.btnLogin); 

    btnLogin.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      EditText txtUserName = (EditText) findViewById(id.txtUserName); 
      EditText txtPass = (EditText) findViewById(id.txtPass); 

      String userName = txtUserName.getText().toString(); 
      String password = txtPass.getText().toString(); 

      new login().execute(userName,password); 
     } 
    }); 



    Button btnSend = (Button) findViewById(id.btnSend); 

    btnSend.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      EditText txtMessage = (EditText) findViewById(id.txtMessage); 
      EditText txtTo = (EditText) findViewById(id.txtTo); 

      String message = txtMessage.getText().toString(); 
      String to = txtTo.getText().toString(); 

      new sendMessage().execute(to,message); 
     } 
    }); 

    Button btnStop = (Button) findViewById(id.btnStopServices); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      EditText txtTo = (EditText) findViewById(id.txtTo); 

      String to = txtTo.getText().toString(); 

      new recieveMessages().execute(to); 
     } 
    }); 


} 

class login extends AsyncTask<String, Void, String>{ 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     String userName = params[0]; 
     String password = params[1]; 

     //XMPPConnection xmpp = new XMPPConnection("jabber.iitsp.com"); 

     xmpp = new XMPPConnection("10.0.2.2"); 

     try { 
      xmpp.connect(); 

      // for other jabber accounts, truncate after the @ 
      //xmpp.login("username", "password"); 

      // for gtalk/gmail, include the @ 
      xmpp.login(userName, password); 
      Log.v(TAG,"Logged in"); 

     } catch (XMPPException e) { 
      Log.v(TAG, "Failed to connect to " + xmpp.getHost()); 
      e.printStackTrace(); 
     } 


     return null; 
    } 

} 

class sendMessage extends AsyncTask<String, Void, String>{ 


    //String msg; 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     String to = params[0]; 
     String message = params[1]; 

     ChatManager chatmanager = xmpp.getChatManager(); 



     Chat newChat = chatmanager.createChat(to, new MessageListener() { 
      // THIS CODE NEVER GETS CALLED FOR SOME REASON 
      public void processMessage(Chat chat, Message message) { 
       try { 
       // msg = message.getBody(); 
       Log.v(TAG, "Got:" + message.getBody()); 
       chat.sendMessage(message.getBody()); 
      } catch (XMPPException e) { 
       Log.v(TAG, "Couldn't respond:" + e); 
      } 
      Log.v(TAG, message.toString()); 
      } 
     }); 

     // Send something to [email protected] 
     try { 
      newChat.sendMessage(message); 
      Log.v(TAG, "sent:" + message); 
     } catch (XMPPException e) { 
      Log.v(TAG, "couldn't send:" + e.toString()); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 

     //Toast.makeText(getBaseContext(),"Message Recieved : " + msg, Toast.LENGTH_LONG); 
     super.onPostExecute(result); 
    } 


} 

class recieveMessages extends AsyncTask<String, Void, String>{ 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     String to = params[0]; 

     // Accept only messages from [email protected] 
     PacketFilter filter 
      = new AndFilter(new PacketTypeFilter(Message.class), 
          new FromContainsFilter(to)); 

     // Collect these messages 
     PacketCollector collector = xmpp.createPacketCollector(filter); 

     while(true) { 
      Packet packet = collector.nextResult(); 

      if (packet instanceof Message) { 
      Message msg = (Message) packet; 
      // Process message 
      Log.v(TAG, "Got message: " + msg.getBody()); 
      } 
     } 

     //return null; 
    } 


} 

} 죄송합니다

답변

0

을 확장합니다.

IM 클라이언트 (pidgin)에 보낼 수있는 한 명의 사용자가 에뮬레이터로 다시 보낼 수 있습니다. 나는. 에뮬레이터에서받을 수 있습니까?

메시지 수신은 이벤트 기반이므로 버튼 클릭으로 설정하지 않아도됩니다.

이 훌륭한 예를 확인하십시오. 에 의해 Davanum Srinivas

내 사용을 위해 꽤 광범위하게 수정되었지만 기본 코드는 여전히 매우 유용합니다.

http://davanum.wordpress.com/2008/12/29/updated-xmpp-client-for-android/ 또한 원본 기사를 참조하십시오.

관련 문제