У меня возникли проблемы с отправкой/получением сообщений с помощью Smack и Openfire. В настоящее время моя установка включает в себя два компьютера. На обоих компьютерах работает эмулятор Android, который запускает программу. Сначала программа запускает активность входа в систему, а затем запускает активность интерфейса чата. Интерфейс чата в настоящее время ничего не делает; после запуска функции ChatInterface сообщение автоматически отправляется.Проблемы с отправкой/получением сообщений с помощью Smack и Openfire
Один компьютер (ноутбук) работает как сервер, а настольный компьютер подключается к серверу ноутбуков (Openfire). Глядя на резюме пользователя Openfire на ноутбуке, оба пользователя, похоже, доступны и готовы к разговору. Однако, когда его время для приема сообщений, ничего не появляется. Сообщения не печатаются на объекте вида, таком как ListView, но в журнале.
Ниже приведен код для ноутбука:
private static final String TAG = "MSG";
private ListView screen;
private EditText textEditor;
private Button sendButton;
private final String Host = "10.0.2.2";
private final int port = 5222;
private AbstractXMPPConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_interface);
screen = (ListView) findViewById(R.id.ScreenView);
textEditor = (EditText) findViewById(R.id.TextEditBox);
sendButton = (Button) findViewById(R.id.SendButton);
Log.d(TAG, "onCreate Chat Interface");
final String username = getIntent().getExtras().getString("Username");
final String password = getIntent().getExtras().getString("Password");
new AsyncConnect().execute(username, password);
sendButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
}
});
Log.d(TAG, "Success");
}
public class AsyncConnect extends AsyncTask<String, Void, Void>
{
ProgressDialog pdLoading = new ProgressDialog(ChatInterface.this);
protected void onPreExecute()
{
pdLoading.setMessage("Loading...");
pdLoading.show();
}
protected Void doInBackground(String...params)
{
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setUsernameAndPassword(params[0], params[1]);
configBuilder.setServiceName("Openfire");
configBuilder.setHost(Host);
configBuilder.setPort(port);
configBuilder.build();
configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); // Remove this later could be security threat
connection = new XMPPTCPConnection(configBuilder.build());
try {
connection.connect();
connection.login();
Log.d(TAG, "Logged on");
Log.d(TAG, "Connection: " + connection.getUser());
if(params[0].equals("test2") && params[1].equals("test2!")) {
Log.d(TAG, "Entered test2");
ChatManager chatManager = ChatManager.getInstanceFor(connection);
Log.d(TAG, "ChatManager");
Chat newChat = chatManager.createChat("[email protected]", new ChatMessageListener(){
public void processMessage(Chat chat, Message message)
{
Log.d(TAG, "Received Message From Desktop: " + message.getBody());
}
});
newChat.sendMessage("This is Jane Doe");
chatManager.addChatListener(
new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally) {
Log.d(TAG, "Entered chatCreated");
if (!createdLocally) {
Log.d(TAG, "Entered Locally");
chat.addMessageListener(new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
try {
Log.d(TAG, "Incoming message...");
Log.d(TAG, "Received message from Desktop: " + message.getBody());
Log.d(TAG, "Message Received");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
});
Log.d(TAG, "Listened");
}
}
catch(SmackException.ConnectionException e)
{
e.printStackTrace();
Log.d(TAG, "SmackException.ConnectionException");
}
catch(XMPPException e)
{
e.printStackTrace();
Log.d(TAG, "XMPPException");
}
catch(IOException e)
{
e.printStackTrace();
Log.d(TAG, "IOException");
}
catch(SmackException e)
{
e.printStackTrace();
Log.d(TAG, "SmackException");
}
return null;
}
protected void onPostExecute(Void params)
{
pdLoading.dismiss();
}
}
Ниже приведен код рабочего стола:
private static final String TAG = "MSG";
private ListView screen;
private EditText textEditor;
private Button sendButton;
private final String Host = "192.168.1.152";
private final int port = 5222;
private AbstractXMPPConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_interface);
screen = (ListView) findViewById(R.id.ScreenView);
textEditor = (EditText) findViewById(R.id.TextEditBox);
sendButton = (Button) findViewById(R.id.SendButton);
Log.d(TAG, "onCreate Chat Interface");
final String username = getIntent().getExtras().getString("Username");
final String password = getIntent().getExtras().getString("Password");
sendButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
}
});
new AsyncConnect().execute(username, password);
Log.d(TAG, "Success");
}
public class AsyncConnect extends AsyncTask<String, Void, Void> {
ProgressDialog pdLoading = new ProgressDialog(ChatInterface.this);
protected void onPreExecute() {
pdLoading.setMessage("Loading...");
pdLoading.show();
}
protected Void doInBackground(String...params) {
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setUsernameAndPassword(params[0], params[1]);
configBuilder.setServiceName("Openfire");
configBuilder.setHost(Host);
configBuilder.setPort(port);
configBuilder.build();
configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); // Remove this later could be security threat
connection = new XMPPTCPConnection(configBuilder.build());
try {
connection.connect();
connection.login();
Log.d(TAG, "Logged on");
Log.d(TAG, "Connection: " + connection.getUser());
if(params[0].equals("test1") && params[1].equals("test1!"))
{
Log.d(TAG, "Entered test1");
ChatManager chatmanager = ChatManager.getInstanceFor(connection);
Log.d(TAG, "ChatManager");
Chat newChat = chatmanager.createChat("[email protected]", new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
Log.d(TAG, message.getBody());
}
});
newChat.sendMessage("This is John Doe");
Log.d(TAG, newChat.getParticipant());
Log.d(TAG, "Message sent");
}
}
catch(SmackException.ConnectionException e)
{
e.printStackTrace();
Log.d(TAG, "SmackException.ConnectionException");
}
catch(XMPPException e)
{
e.printStackTrace();
Log.d(TAG, "XMPPException");
}
catch(IOException e)
{
e.printStackTrace();
Log.d(TAG, "IOException");
}
catch(SmackException e)
{
e.printStackTrace();
Log.d(TAG, "SmackException");
}
return null;
}
protected void onPostExecute(Void params)
{
pdLoading.dismiss();
}
}
методы Ни processMessages в настоящее время называют ничего не печатается в LogCat.
Я не совсем уверен, в чем проблема. Некоторые из документации Smack, похоже, устарели, и нет большого количества полезных ресурсов для API. Кто-нибудь знает, что может быть проблемой?
Ого, спасибо за очищая много вещей Что такое ресурс? Предполагается ли он быть каким-то идентификатором? – Czar
Это идентификатор клиента (скажем, как «Skype»), но если вы его не установили, это значение по умолчанию; необходимо доставить meggages на правильное устройство (usecase: вы подключены как со смартфоном, так и планшетом), но значение по умолчанию может ввести в заблуждение сервер xmpp. Если это поможет, не забудьте принять ответ;) – MrPk
Большое спасибо за информативный пост. – Czar