XMPP: Smack client ne reçoit pas de message de chat
J'ai eu du mal avec XMPP bavarder un lot par le biais de Smack et serveur Openfire.
Mon problème est comme suit:
Chaque fois qu'un utilisateur envoie un message à un autre utilisateur, le message est reçu correctement à l'autre utilisateur. Mais aucune réponse ne s'est pas présenté à l'expéditeur du message premier.
Si l'Utilisateur 1 envoie à l'Utilisateur 2 avec succès. L'utilisateur 2 est alors impossible d'envoyer à l'Utilisateur 1 aucune réponse.
D'autre part, si je redémarre et permettre aux utilisateurs de se connecter à nouveau, l'Utilisateur 2 peut envoyer à l'Utilisateur 1, mais pas vice-versa.
Ce que j'essaie de dire, c'est que seul l'initiateur de la conversation peut envoyer un message, le récepteur ne peut pas la réponse.
Mon code ressemble à cette
package xmpp;
public class XMPPClient{
private static final int packetReplyTimeout = 500; //millis
private XMPPConnection connection;
private ChatManager chatManager;
private MessageListener messageListener;
private ConnectionConfiguration config;
private MyTimer t = MyTimer.getInstance();
private ArrayList<String> threadPool = new ArrayList<String>();
public XMPPClient()
{
SmackConfiguration.setPacketReplyTimeout(packetReplyTimeout);
//define openfire server information
config = new ConnectionConfiguration("localhost",5222);
config.setSASLAuthenticationEnabled(false);
config.setSecurityMode(SecurityMode.disabled);
connection = new XMPPConnection(config);
//connect to server
t.start("Connecting to server...");
try {
connection.connect();
} catch (XMPPException e) {
System.err.println("Failed to connect to server! Connect to VPN!\t"+e.getMessage());
System.exit(0);
}
t.end("Connection took ");
//setup chat mechanism
chatManager = connection.getChatManager();
chatManager.addChatListener(
new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally)
{
if (!createdLocally)
chat.addMessageListener(new MyMessageListener());
}
});
}
public boolean login(String userName, String password, String resource) {
t.start("Logging in...");
try {
if (connection!=null && connection.isConnected())
connection.login(userName, password, resource);
//set available presence
setStatus(true);
}
catch (XMPPException e) {
if(e.getMessage().contains("auth")){
System.err.println("Invalid Login Information!\t"+e.getMessage());
}
else{
e.printStackTrace();
}
return false;
}
t.end("Logging in took ");
return true;
}
public void setStatus(boolean available) {
if(available)
connection.sendPacket(new Presence(Presence.Type.available));
else
connection.sendPacket(new Presence(Presence.Type.unavailable));
}
public void sendMessage(String message, String buddyJID) throws XMPPException {
System.out.println(String.format("Sending mesage '%1$s' to user %2$s", message, buddyJID));
boolean chatExists = false;
Chat c = null;
for(String tid : threadPool)
{
if((c = chatManager.getThreadChat(tid)) != null)
{
if(c.getParticipant().equals(buddyJID))
{
if(checkAvailability(buddyJID))
{
chatExists = true;
break;
}
else
{
threadPool.remove(tid);
break;
}
}
}
}
if (chatExists)
{
Chat chat = c;
chat.sendMessage(message);
}
else
{
Chat chat = chatManager.createChat(buddyJID, messageListener);
threadPool.add(chat.getThreadID()); System.out.println(chat.getThreadID());
chat.sendMessage(message);
}
}
public void createEntry(String user, String name) throws Exception {
System.out.println(String.format("Creating entry for buddy '%1$s' with name %2$s", user, name));
Roster roster = connection.getRoster();
roster.createEntry(user, name, null);
}
public boolean checkAvailability(String jid)
{
System.out.print("Checking availability for: "+jid+"=");
System.out.println(connection.getRoster().getPresence(jid).isAvailable());
return connection.getRoster().getPresence(jid).isAvailable();
}
public void disconnect() {
if (connection!=null && connection.isConnected()) {
setStatus(false);
connection.disconnect();
}
}
}
import org.jivesoftware.smack.packet.Message;
public class MyMessageListener implements MessageListener {
@Override
public void processMessage(Chat chat, Message message) {
String from = message.getFrom();
String body = message.getBody();
System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
}
}
Je ne suis pas sûr que le problème est. Toutes les suggestions? Exemple de code?
Merci <3
OriginalL'auteur saada | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr si cela va vous aider, mais je peux obtenir de réponse avec ce code:
Je suis l'envoi de "Hey", alors que jamais l'autre utilisateur écrit, je vais voir dans mon logcat.
Je suis face à problème dans l'envoi de msg sur xmpp, vous pouvez venir sur ce lien pour aider à résoudre le problème
je suis d'erreur à chatmanager.createChat(userToSend,de nouvelles MessageListner()), il est dit que le 2ème argument argument est faux. il dit argument doit être ChatMessageListner. merci de m'aider..
je suis à l'aide de Smack 4.1.7
OriginalL'auteur farminf
Vous n'avez pas spécifié que le récepteur est, par exemple, si c'est un client existant (comme Spark par exemple), ou plus de code personnalisé. Ce qui serait utile, comme le ferait savoir quelle est la version de Smack vous utilisez.
Code a plusieurs problèmes avec elle.
tout simplement en réutilisant le même chat.
Je suis face à problème dans l'envoi de msg sur xmpp, vous pouvez venir sur ce lien pour aider à résoudre le problème
surtout +1 pour "la création d'un nouveau chat des objets pour chaque message" .....
OriginalL'auteur Robin
le code est très compliqué et il semble est destiné uniquement à envoyer des messages.
Voici un exemple de code qui fonctionne parfaitement, envoi et de la réception:
http://www.javaprogrammingforums.com/java-networking-tutorials/551-how-write-simple-xmpp-jabber-client-using-smack-api.html
Il y a une certaine différence, parce que je l'ai exécuter ce code de n, il fonctionne parfaitement, envoi n de la réception. Peut-être il ya une erreur du serveur,
J'ai même changé le code pour utiliser des composants swing plutôt que d'utiliser le Système de Base de IO, n c'est bien trop de travail
le lien est mort tous ceux qui ont des nouveau lien ou de l'échantillon pour cette
OriginalL'auteur vedant