Я применил приложение чата с помощью aSmack. Я использовал сервер openfire как сервер чата. Все эти приложения работают на одном компьютере. Но когда я пытаюсь отправить сообщения между двумя эмуляторами, только один эмулятор успешно получает сообщения. Другой клиент не получит никаких сообщений. Но от обоих эмуляторов я смог отправлять сообщения к pigin (IM-клиенту). Также, если я использую gmail.com в качестве сервера чата, все работает отлично.
Имена пользователей, используемые для входа в систему jayamal suchith (openfire означает, что пользователи подключены к сети)
имена, используемые для отправки сообщений jayamal @elearn (elearn - это домен i, созданный на моей машине, с использованием openfire) suchith @elearn
(но в архивах openfire отображается одно имя как jayamal @elearn/Smack, пытались отправить сообщение на это имя, но оно также не увенчалось успехом)
Пожалуйста, помогите устранить эту проблему. Ваша помощь очень ценится.
Открытый класс 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;
}
}
}
Извините, это немного запоздало.
Один пользователь, которого вы можете отправить клиенту IM (pidgin), вы можете отправить обратно на свой эмулятор. Т.е. вы можете получить в эмуляторе?
Прием сообщений основан на событиях, поэтому вам не нужно использовать кнопку "Щелчок", чтобы установить его.
Посмотрите на этот отличный пример. Автор: Davanum Srinivas
Я изменил его для моего использования довольно широко, но базовый код по-прежнему очень полезен.
http://davanum.wordpress.com/2008/12/29/updated-xmpp-client-for-android/ также смотрите оригинальную статью.