Da ich gerade an einem Projekt arbeite, dass XMPP auf Java verwendet, hab ich mir zu Testzwecken eine Klasse gebaut, die Smack verwendet und ein paar Moeglichkeiten der API nutzt. Es ist unter anderem moeglich sich zu verbinden, das Roster auszulesen und empfangene Nachrichten anzuzeigen. Da mir bei der offiziellen Dokumentation Beispiele gefehlt haben, die man auf einen Rutsch kopieren und bearbeiten kann, moechte ich hier ein wirklich lauffaehiges Beispiel veroeffentlichen. Ich hoffe, damit kann jemand was anfangen:
import java.util.Collection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
public class SmackTester {
private XMPPConnection conn;
private String username;
private String password;
private String server;
public SmackTester() {
// debug option
XMPPConnection.DEBUG_ENABLED = false;
username = "einuser";
password = "einpasswort!";
server = "jabber.foo.bar";
makeConn();
doConnect();
makeRoster();
chatAction();
// wait ... (I know that's pretty ugly)
while (conn.isConnected()) {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// nothing interesting here
public static void main(String[] args) {
new SmackTester();
}
private void doConnect() {
// let's connect
try {
conn.connect();
conn.login(username, password, "someRessource");
} catch (XMPPException e) {
System.err.println("Login failed!");
e.printStackTrace();
System.exit(1);
}
System.out.println("Login succesful!");
}
private void makeConn() {
ConnectionConfiguration config = new ConnectionConfiguration(server,
5222);
// pass some connection options
config.setSASLAuthenticationEnabled(true);
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
conn = new XMPPConnection(config);
}
private Roster makeRoster() {
Roster roster = conn.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
// print out all entries in roster
System.out.println("---------- entries in roster -----------");
for (RosterEntry entry : entries) {
System.out.println(entry);
}
System.out.println("---------- entries in roster -----------");
// react to changes in roster
roster.addRosterListener(new RosterListener() {
// called methods ...
public void entriesDeleted(Collection<String> addresses) {
// do stuff
}
public void entriesUpdated(Collection<String> addresses) {
// do stuff
}
public void presenceChanged(Presence presence) {
System.out.println("Presence changed: " + presence.getFrom()
+ " " + presence);
}
public void entriesAdded(Collection<String> arg0) {
// do stuff
}
});
return roster;
}
private void chatAction() {
PacketTypeFilter filter = new PacketTypeFilter(Message.class);
PacketListener myListener = new PacketListener() {
public void processPacket(Packet arg0) {
if (arg0 instanceof Message) {
Message msg = (Message) arg0;
System.out.println("Message: " + msg.getFrom() + " "
+ msg.getBody());
}
}
};
// Register the listener.
conn.addPacketListener(myListener, filter);
}
private void doDisconnect() {
conn.disconnect();
System.out.println("Disconnected");
}
}
Nach vielen Stunden hat dies zu einem ersten funktionierenden Chat geführt. Danke
![]()
Hmmm. Irgendwie auch nur ne Zusammenfassung der offiziellen Doku. Versteh auch nicht, wieso man aus der Doku nich deren Beispiele ebenso rauskopieren können soll. Eins, zwei Methodennamen drumherum und das funktioniert auch auf Anhieb. Ich hab selten so eine schöne und verdammt simple Doku gelesen. Kann natürlich auch sein, dass zum Zeitpunkt des Schreibens die Doku noch nicht auf heutigen Stand war.
Ganz einfach: Ich wollte ein voll funktionsfähiges Beispiel haben und so etwas habe ich damals in der offiziellen Doku nicht gefunden.
Wie man an den anderen Kommentaren erkennen kann, gab es schon anderen, denen der Artikel geholfen hat. Damit ist die Daseinsberechtigung dieses Beispiels ebenfalls geklärt.


