# XMPP Smack API MultiUserChat createPrivateChat



## gerdgerdgerd (6. Jan 2011)

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:

```
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 (8. Jan 2011)

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:

```
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 (9. Jan 2011)

Ich habe weiteres herausgefunden 

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


```
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:

```
connection.addPacketListener(this, new PacketTypeFilter(Packet.class));
```

hauptsache das problem gelöst. 

gruß


----------

