XMPP Smack API MultiUserChat createPrivateChat

gerdgerdgerd

Aktives Mitglied
Hallo zusammen,

ich möchte einen Chat mit Hilfe von XMPP realisieren. Für die Anbindung verwende ich die Smack API und www.jabber.org. Aktuell kann ich einen MultiUserChat bzw. eine Conference erstellen und auch mit den darin vorhandenen Personen schreiben. Nun habe ich das Problem, wenn ich einen privaten Chat erstellen möchte.

Smack Extensions User Manual

Hier ist der Auszug aus meinem Quellcode:
Java:
chat = muc.createPrivateChat(user.getJid(), this);
...
@Override
	public void actionPerformed(ActionEvent event) {
		if(event.getSource() == sendButton) {
			try {
				chat.sendMessage(messageField.getText());
				messageField.setText("");
			} catch (XMPPException e) {
				e.printStackTrace();
			}
		}
	}

user.getJid() liefert folgendes zurück: myroom@conference.jabber.org/johndoe... und der Benutzer ist auch definitiv innerhalb des MultiUserChat vorhanden bzw. eingeloggt. Wenn ich nun etwas sende passiert gar nichts! keine exception, nichts!

PS: Die Dokumentation von den oben genannten Link ist veraltet und daher weicht die API ein bisschen ab.

Gruß
gerdgerdgerd
 

gerdgerdgerd

Aktives Mitglied
Ich weiß nun wo das Problem liegt. Wenn ein privater Chat erstellt wird, wird diesem einen sogenannte "threadId" zugewiesen. Erstellen nun zwei Personen getrennt voneinander einen privaten Chat, haben beide Chats eine unterschiedliche threadId, was auch logisch ist.

Und was heisst das für mich:
Wenn jemand einen privaten Chat erstellt hat und darüber eine Nachricht versendet, muss der andere Client diese Anfrage annehmen und entsprechend einen Chat mit der selben threadId erstellen. Das Problem ist nun, genau diese Nachricht zu erhalten, ohne einen Chat geöffnet zu haben.

hierzu mache ich folgendes:
Java:
connection.addPacketListener(this, new PacketTypeFilter(Packet.class));
...
@Override
	public void processPacket(Packet packet) {
		System.out.println("ENTER processPacket");
		if (packet instanceof Message) {
			Message msg = (Message) packet;
			textarea.append(getNickname(msg.getFrom()) + ": " + msg.getBody() + "\n");
			System.out.println("Message: " + msg.getFrom() + " " + msg.getBody());
		}
	}

Wenn ich den Smack Debugger einstelle, kann ich über diesen die erhaltenen Nachrichten sehen. Aber leider wird der PacketListener nicht aufgerufen. D.h. die Nachrichten kommen an, aber ich habe keinen Listener der sich für diese Nachricht verantwortlich fühlt :) ... Allgemeiner (wie auf die XMPPConnection) kann ich keinen Listener registrieren.

Ich hoffe das Problem ist verständlich...
 

gerdgerdgerd

Aktives Mitglied
Ich habe weiteres herausgefunden :)

man muss vorher mit folgenden listener schauen ob ein neuer chat geöffnet wurde:

Java:
ChatManager chatManager = connection.getChatManager();
chatManager.addChatListener(this);
 
...
@Override
    public void chatCreated(Chat chat, boolean createdLocally) {
        System.out.println("Chat created: " + chat.getThreadID() + ", " + createdLocally);
    }

die frage ist nur, warum der folgende listener nicht greift:
Java:
connection.addPacketListener(this, new PacketTypeFilter(Packet.class));

hauptsache das problem gelöst. :)

gruß
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1

Ähnliche Java Themen


Oben