Qt Instant Messenger

Präsentation und Organisation von eigenen Projekten
Antworten
nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Qt Instant Messenger

Beitrag von nufan » Mi Dez 30, 2009 8:31 pm

Damit ihr seht, dass ich in letzter Zeit nicht ganz untätig war, möchte ich euch mein aktuelles Projekt vorstellen :)

Schon seit längerer Zeit arbeite ich an einem Instant Messenger. Früher hab ich noch mit SDL und SDLNet gearbeitet, da das aber ziemlich umständlich (und das GUI ziemlich hässlich) war, hab ich inzwischen auf Qt umgestellt.
An dieser Stelle mal großes Lob an die Qt-Entwickler: Die Bibliothek ist gigantisch und trotzdem einfach zu benutzen. Die Dokumentation sollten sich andere (auch bzw. ganz besonders ich...) zum Vorbild nehmen. Qt-Creator ist die beste IDE die ich kenne. Unglaublich schnelle Intellisense, automatische Einrückungsanpassungen, Subversion/git integriert, eingebaute Referenz, etc. Kann ich nur jedem empfehlen.

Da mir Skype auf Linux ziemlich gut gefällt, hab ich mein GUI ziemlich ähnlich aufgebaut. Es gibt also ein Hauptfenster in dem alle verbundenen Personen mit Messenger aufgelistet werden und man auch seinen Namen ändern kann. Ein Textfeld zur Eingabe der IP ist ebenfalls da.
Natürlich kann man auch (UTF-16) Nachrichten verschicken. Der ChatLog unterstützt auch HTML-Tags für Schriften, Links und Bilder (müssen aber lokal gespeichert sein). Hat man das entsprechende Chat-Fenster nicht offen, erscheint ein nerviges kleines Popup am rechten unteren Bildschirmrand, dass beim Draufklicken das Fenster öffnet ;)
Dazu hab ich noch ein paar Extra-Features eingebaut. Screen-Sharing ist möglich, eine entsprechend schnelle Verbindung ist Voraussetzung für eine erfolgreiche Übertragung. Mit TicTacToe hab ich auch ein kleines Spiel eingebaut, nichts aufregendes, eher zum Testen. Dateien verschicken kann man auch. Bei einigen Sachen fehlen noch die Dialoge (z.B. ob man denn wirlkich die Datei empfangen oder spielen will).
Wenn man auf das 'X' im Hauptfenster klickt wird der Messener nicht wirklich geschlossen sondern das Fenster nur versteckt. Es kann über einen Klick auf den Tray wieder sichtbar gemacht werden. Beenden kann man es über einen Rechtsklick auf den Tray oder File-Quit in der Menüleiste. Sollte man wirklich ein System haben, dass keine Trays unterstützt wird das Programm natürlich beendet. Das Tray-Bild... das war eine 30 Sekunden-GIMP-Aktion ^^ Für Vorschläge bin ich offen.
So... zum technischen. Jeder Messenger ist sowhol Server, als auch Client. D.h. der Benutzer muss Port 1338 in der Firewall öffnen und ggfs. am Router Portweiterleitung konfigurieren. Kontakte im lokalen Netzwerk werden über UDP-Broadcasts automatisch erkannt. Proxy konnte ich leider nicht testen. Ich gehe nur in der Schule über Proxy ins Internet und IM stehen bei den Admins auf der Abschussliste...

Ich habe hauptsächlich auf Ubuntu getestet. Mein etwas in die Jahre gekommener FreeBSD-Rechner brauchte am Ende über 40 Minuten zum Kompilieren...
Auf Windows bekommt man noch ein Konsolenfenster eingeblendet. Muss wohl an der Test-Bibliothek liegen, die ich aber für Screen-Sharing brauche.


Was wird zum Ausführen gebraucht:
* Ubuntu: libqtcore4, libqt4-network (ist glaube ich sogar eine Abhängigkeit)
* Windows: Qt-Framework (http://qt.nokia.com/downloads)
* FreeBSD 8: qt-4.5.2 (oder ähnlich)

Was wird zum Kompilieren gebraucht:
* Ubuntu: libqt4-dev
* Windows: Qt-SDK (nehmt aber lieber das Framework mit meiner vorkompilierten Version)
* FreeBSD 8: das selbe wie oben

Kompilieren:
* ins Code-Verzeichnis wechseln
* Projekt-Datei erstellen: qmake -project
* folgende Zeilen zur *.pro Datei hinzufügen:
QT += network
QT += testlib
* Makefile erstellen: qmake
* Makefile ausführen: make
Unter Windows werden Unterordner debug und release erstellt. Die .exe von dort in den übergeordneten Ordner kopieren, da sonst die Pfade zum Tray etc. nicht mehr stimme.

Dem Code liegt zwar ein kleines FAQ bei, hier aber trotzdem die wichtigsten Punkte zusammengefasst:
Q: Funktioniert das auch übers Internet?
A: Jein. Es gibt keinen zentralen Server, daher muss man die IP des Gegenübers wissen. Screensharing übers Internet ist aufgrund mangelnder Bandbreite ehrlich gesagt unbrauchbar.

Q: Welche Plattformen werden unterstützt?
A: Ich verwende nur C++ und Qt. Daher sollte das Programm auf allen von Qt unterstützten Plattformen funktionieren.

Q: Ist das sicher?
A: Nein. Alle Nachrichten werden in Klartext übertragen und Kontakte sehen die IP. Das ist ein Punkt, den ich sicher noch verbessern werde. Aus bequemlichkeit beim Testen hab ich sie vernachlässigt.

Q: Jemand ist in einem anderen Subnetz und wird nicht erkannt. Kann man das ändern?
A: Subnetze gibt es nicht ohne Grund. Es funktioniert nicht und ich werde es auch nicht implementieren. Es wäre ohnehin unglaublich schwierig (IP-Pakete selbst zusammenbauen...) und höchst wahrscheinlich systemabhängig.

Q: Empfängst du meine Nachrichten?
A: Nein. Die Nachrichten werden nur an die Personen im Chat geschickt.

Q: Und wo ist die Dokumentation?
A: Wird (hoffentlich...) bald da sein...

Q: Auf meinem Handy sieht das Programm hässlich aus. Kann ich das ändern?
A: Jeder kann den Quellcode ändern. Ich hab (leider) kein Maemo/Symbian Handy mit dem ich testen könnte.


Download:
* Quellcode + vorkompiliert für Ubuntu: http://uploading.com/files/43cd8216/mes ... u.tar.bz2/
* Quellcode + vorkompiliert für Windows: http://uploading.com/files/133f53d6/mes ... ndows.zip/
* nur Quellcode: http://uploading.com/files/m9fbm9d3/mes ... ource.zip/

UbuntuOne-Benutzer können mir ihre Mail-Adresse geben, dann können sie automatisch mit meinem UbuntuOne-Share synchronisieren.

Anregungen, Wünsche, Beschwerden gewünscht :)

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: Qt Instant Messenger

Beitrag von stampuhh » Do Dez 31, 2009 1:24 pm

So dann fange ich mal an ;)

Ubunutu 9.04: läuft
Xubuntu 9.10: läuft (auch wenn man zur Ausführung noch das dev-Packet braucht)

Dann gleich mal ein paar kleine Anregungen:

- Ich habe mich jetzt selber schon zwei mal in der Liste..ich kann sozusagen mit mir selber chatten. Das ist ja nicht das Problem sondern ich bekomme mich nicht aus der Liste gelöscht?
- Screensharing funktioniert auch, allerdings kann nur der, der shared das auch wieder beenden. Schöner wäre es doch wenn es beide beenden könnten. Ich kann als Zuschauer zwar das Fenster schließen, aber es kommt sofort wieder ;)
(ist mir jetzt aufgefallen, da ich an zwei PCs in unterschiedlichen Stockwerken arbeite und ich dummerweise nicht an beiden Orten gleichzeitig sein kann :D)

Mein 2. PC wurde ohne Probleme erkannt und chatten funktioniert auch ohne Probleme. Layout schön einfach gehalten gefällt mir gut.

Wie das ganze außerhalb meines LANs funktioniert konnte ich aber noch nicht testen. Das ganze sieht auf jeden Fall recht interessant aus. So etwas hätten ich früher inner Schule gerne gehabt ;)

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Qt Instant Messenger

Beitrag von nufan » Do Dez 31, 2009 1:47 pm

stampuhh hat geschrieben:Xubuntu 9.10: läuft (auch wenn man zur Ausführung noch das dev-Packet braucht)
Zum Ausführen braucht man das dev-Paket? Ist mir neu... werde ich mal testen.
stampuhh hat geschrieben:- Ich habe mich jetzt selber schon zwei mal in der Liste..ich kann sozusagen mit mir selber chatten. Das ist ja nicht das Problem sondern ich bekomme mich nicht aus der Liste gelöscht?
Löschen kann man Kontakte noch nicht. Aber, dass du dich selbst siehst sollte nicht sein. Beim Empfangen des Broadcasts wird geprüft ob von einem internen Netzwerkgerät geschickt wurde. Kannst du den Fehler vielleicht reproduzieren, mir die Konsolenausgabe zeigen und dein Netzwerk kurz beschreiben?
stampuhh hat geschrieben:- Screensharing funktioniert auch, allerdings kann nur der, der shared das auch wieder beenden. Schöner wäre es doch wenn es beide beenden könnten. Ich kann als Zuschauer zwar das Fenster schließen, aber es kommt sofort wieder ;)
:shock: Dachte, dass hätte ich schon implementiert... steht jetzt jedenfalls ganz oben auf der ToDo-List, ist auch nicht aufwendig zu implentieren :)
EDIT: Bug gefixt :)
stampuhh hat geschrieben:(ist mir jetzt aufgefallen, da ich an zwei PCs in unterschiedlichen Stockwerken arbeite und ich dummerweise nicht an beiden Orten gleichzeitig sein kann :D)
Warum nicht ssh -X? Oder vnc? :)
stampuhh hat geschrieben:Wie das ganze außerhalb meines LANs funktioniert konnte ich aber noch nicht testen.
Sollte genauso funktionieren, nur, dass die Kontakte nicht automatisch erkannt werden und du die IP-Adresse eingeben musst.
stampuhh hat geschrieben:So etwas hätten ich früher inner Schule gerne gehabt ;)
Das war Anfangs auch der Grund so was zu schreiben ;)

Vielen Dank für die Rückmeldung :)

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: Qt Instant Messenger

Beitrag von stampuhh » Do Dez 31, 2009 2:31 pm

Zum Ausführen braucht man das dev-Paket? Ist mir neu... werde ich mal testen.
Da bin ich mir nicht sicher. Ich habe die vorcompilierte Version auf den Rechner gezogen und wollte sie starten. Da kam eine Fehlermeldung von wegen irgendeiner Datei die fehlt. (glaube libqttest.so oder so in der Art). Dann wollte ich es selber compilieren und habe halt das dev packet installiert. Vorcompilierte Version noch mal getestet und siehe da, es geht ;)
Löschen kann man Kontakte noch nicht. Aber, dass du dich selbst siehst sollte nicht sein. Beim Empfangen des Broadcasts wird geprüft ob von einem internen Netzwerkgerät geschickt wurde. Kannst du den Fehler vielleicht reproduzieren, mir die Konsolenausgabe zeigen und dein Netzwerk kurz beschreiben?
ok, habe ich mich vielleicht falsch ausgedrückt. Ich tauche nicht automatisch bei mir selber auf, hat also denke mal nichts mit meinem Netzwerk zu tun. Ich habe das IP-Feld im Messenger getestet und meine eigene IP eingegeben. Darauf hin war ich halt selber in meiner Liste und zwar genau zwei mal (bei einem "enter"). Zwei mal "enter" => 4 mal in der eigenen Liste usw.
Warum nicht ssh -X? Oder vnc? :)
Also das ganz normale vnc Programm was bei Ubuntu dabei ist lässt mich nicht. Habe mich mit sowas bisher noch nicht auseinander gesetzt. Wäre aber mal ne Idee...
:shock: Dachte, dass hätte ich schon implementiert... steht jetzt jedenfalls ganz oben auf der ToDo-List, ist auch nicht aufwendig zu implentieren :)
EDIT: Bug gefixt :)
nachher oder morgen mal testen...sobald wieder Zeit da ist. Erst mal Schnee schieben :(

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Qt Instant Messenger

Beitrag von nufan » Do Dez 31, 2009 2:39 pm

stampuhh hat geschrieben:Da bin ich mir nicht sicher. Ich habe die vorcompilierte Version auf den Rechner gezogen und wollte sie starten. Da kam eine Fehlermeldung von wegen irgendeiner Datei die fehlt. (glaube libqttest.so oder so in der Art). Dann wollte ich es selber compilieren und habe halt das dev packet installiert. Vorcompilierte Version noch mal getestet und siehe da, es geht ;)
Hmm... kann sein, dass die testlib nur im dev-Paket enthalten ist. In Zukunft werde ich sowieso versuchen sie nicht zu verwenden. Rufe nämlich nur 1 Funktion daraus auf...
stampuhh hat geschrieben:ok, habe ich mich vielleicht falsch ausgedrückt. Ich tauche nicht automatisch bei mir selber auf, hat also denke mal nichts mit meinem Netzwerk zu tun. Ich habe das IP-Feld im Messenger getestet und meine eigene IP eingegeben. Darauf hin war ich halt selber in meiner Liste und zwar genau zwei mal (bei einem "enter"). Zwei mal "enter" => 4 mal in der eigenen Liste usw.
Achso, das ist was anders :)
Daran hab ich gar nicht gedacht, danke für den Hinweis.
stampuhh hat geschrieben:Also das ganz normale vnc Programm was bei Ubuntu dabei ist lässt mich nicht. Habe mich mit sowas bisher noch nicht auseinander gesetzt. Wäre aber mal ne Idee...
In 9.04 ist da glaube ich ein Bug. Ansonsten beim Server unter System - Einstellungen - Entfernter Bildschirm einstellen.
stampuhh hat geschrieben:nachher oder morgen mal testen...sobald wieder Zeit da ist.
Da kommen sicher noch ein paar ähnliche Meldungen dazu, bis zum nächsten Upload warte ich noch ein bisschen ^^
Wenn mir ein brauchbarer Projektname einfallen würde, könnte ich ein Sourceforge-Projekt erstellen...

EDIT: Habs mir überlegt :)
http://uploading.com/files/c5933778/mes ... u.tar.bz2/
Beseitigt unter anderem die erwähnten Fehler.
stampuhh hat geschrieben:Erst mal Schnee schieben :(
Hehe... geschneit hats bei uns schon seit Wochen nicht ;)

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Qt Instant Messenger

Beitrag von Kerli » Sa Jan 02, 2010 10:07 pm

Das Programm macht ja schon einmal einen guten Eindruck, aber trotzdem sind mir ein paar Sachen aufgefallen ;)
stampuhh hat geschrieben:- Ich habe mich jetzt selber schon zwei mal in der Liste..ich kann sozusagen mit mir selber chatten.
Das kann ich nicht bestätigen. Bei mir bin ich immer nur einmal in der Liste.
stampuhh hat geschrieben:Ich habe die vorcompilierte Version auf den Rechner gezogen und wollte sie starten. Da kam eine Fehlermeldung von wegen irgendeiner Datei die fehlt. (glaube libqttest.so oder so in der Art).
Das gleiche Problem habe ich auch. Wenn ich die vorkompilierte Version unter Ubuntu 9.10 (64 bit) ausführen möchte kommt folgende Meldung:
./messenger: error while loading shared libraries: libQtTest.so.4: cannot open shared object file: No such file or directory
Ich hab es aber kontrolliert, die Datei gibt es eindeutig. Die selbst kompilierte Version funktioniert hingegen problemlos.

Bei mir hat es etwas gedauert bis ich die Textnachrichten rechts unten entdeckt habe. Irgendwie bin ich es wohl gewohnt das die rechts oben auftauchen... Abgesehen von diesen Meldungen erkennt man jedoch nicht wenn man angeschrieben wurde. Da würde ich es gut finden wenn man im Trayicon und/oder in der Kontaktliste erkennen würde wenn man neue Nachrichten erhalten hat.

Meistens wird das Programm beim Schließen des Fensters nicht beendet, sondern das Trayicon bleibt erhalten. Wenn jemand jedoch den Bildschirm mit mir geshared hat und ich sein Fenster beende wenn das Hauptfenster geschlossen ist wird das Programm beendet.

Auch das Spiel ist ganz nett, nur beendet es sich nicht wenn es eigentlich zu Ende ist sondern man kann immer weiter klicken und bekommt die Meldung das man gewonnen/verloren hat.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Qt Instant Messenger

Beitrag von nufan » Sa Jan 02, 2010 11:04 pm

Kerli hat geschrieben:Das kann ich nicht bestätigen. Bei mir bin ich immer nur einmal in der Liste.
Das wurde in der letzten Version gefixt und sollte kein Problem mehr sein. Wobei ich noch überlege wie ich verhindere, dass jemand übers Internet eine Schleife zu sich selbst legt...
Kerli hat geschrieben:Ich hab es aber kontrolliert, die Datei gibt es eindeutig. Die selbst kompilierte Version funktioniert hingegen problemlos.
Hmm... hast du vielleicht 64-bit und Qt sucht im falschen Verzeichnis? Egal, muss diese Testlib sowieso loswerden...
Kerli hat geschrieben:Bei mir hat es etwas gedauert bis ich die Textnachrichten rechts unten entdeckt habe. Irgendwie bin ich es wohl gewohnt das die rechts oben auftauchen... Abgesehen von diesen Meldungen erkennt man jedoch nicht wenn man angeschrieben wurde. Da würde ich es gut finden wenn man im Trayicon und/oder in der Kontaktliste erkennen würde wenn man neue Nachrichten erhalten hat.
Unterschiedliche Tray-Icons sind in Planung. Meine künstlerische Begabung erkennt man ja am jetzigen... ^^
Für die Chat-Fenster plane ich einen eigenen Tab im Hauptfenster. Diese werden dann entsprechend gekennzeichnet.
Kerli hat geschrieben:Meistens wird das Programm beim Schließen des Fensters nicht beendet, sondern das Trayicon bleibt erhalten. Wenn jemand jedoch den Bildschirm mit mir geshared hat und ich sein Fenster beende wenn das Hauptfenster geschlossen ist wird das Programm beendet.
Danke für den Hinweis, 1 Zeile Code hat das erledigt :)
Kerli hat geschrieben:Auch das Spiel ist ganz nett, nur beendet es sich nicht wenn es eigentlich zu Ende ist sondern man kann immer weiter klicken und bekommt die Meldung das man gewonnen/verloren hat.
Ist mir auch bekannt und (mehr oder weniger) erledigt.

Ich weiß, dass es viel Aufwand ist die (nicht gerade kleine) Qt-Bibliothek auf mindestens zwei Rechnern zu installieren und zu testen. Deshalb bin ich für jede Kritik dankbar :)
Ich möchte nochmals darauf hinweisen, dass das Programm weit davon entfernt ist wirklich brauchbar zu sein und noch einige Macken (vor allem in der Fensterverwaltung) hat.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Qt Instant Messenger

Beitrag von Jside » So Jan 03, 2010 6:31 am

Gefällt mir.

Ich hätte noch Anregungen:
- Masterserver, der eine Liste mit allen Teilnehmern führt, die dann vom Client abgerufen werden kann(aber nicht muss).
- Qt unterstützt doch CSS, dann CSS'e doch mal das ganze in nen netten Look ;)
- Verschlüsselung (z.b. die Clienten senden sich zuerst gegenseiting eine Uhrzeit und eine srand() Summe, auf deren Basis dann die Nachrichten ver/entschlüsselt werden.)

Wenn du irgendwie SVN/Projektwebsite/Downloadseite/Mirrorseite brauchst kannste dich bei mir melden ;)

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Qt Instant Messenger

Beitrag von nufan » So Jan 03, 2010 12:05 pm

Jside hat geschrieben:- Masterserver, der eine Liste mit allen Teilnehmern führt, die dann vom Client abgerufen werden kann(aber nicht muss).
Das liegt ganz weit in der Zukunft, daran wage ich noch gar nicht zu denken...
Jside hat geschrieben:- Qt unterstützt doch CSS, dann CSS'e doch mal das ganze in nen netten Look ;)
Das liegt außerhalb meiner Fähigkeiten, da arbeite ich lieber mit Layouts, geht (fast) wie von allein :)
Für Design-Vorschläge zur Widget-Anordnung (und vielleicht etwas schönere Icons...) bin ich immer offen.
Jside hat geschrieben:- Verschlüsselung (z.b. die Clienten senden sich zuerst gegenseiting eine Uhrzeit und eine srand() Summe, auf deren Basis dann die Nachrichten ver/entschlüsselt werden.)
Qt unterstützt von sich aus SSL-Sockets. Einen SSL-Server gibts aber nicht, den müsste ich mir selber implementieren. Hab mich aber auch noch nicht wirklich damit beschäftigt. Eine Absturzsichere Fensterverwaltung ist mir wichtiger.
Jside hat geschrieben:Wenn du irgendwie SVN/Projektwebsite/Downloadseite/Mirrorseite brauchst kannste dich bei mir melden ;)
Danke für das Angebot, aber ich habe anscheinend doch noch mehr Bugs als erwartet... vielleicht werde ich mal darauf zurückkommen :)

Antworten