Klicke auf Download, um das Projekt zum testen herunterzuladen.
Bevor es richtig los geht, widmen wir uns den schematischen Aufbau eines Chat-Systems.
Wichtig ist zu verstehen, wie ein Netzwerk-Programm funktioniert. Man muss sich die einzelnen Clienten als Personen vorstellen, die nicht direkt miteinander kommunizieren können. Sie benötigen dafür eine Person, die die Informationen an alle anderen weitergibt, den "Server".
Hier nun eine Übersicht, wie der Ablaufplan eines einfachen Chats aussieht.
| Client | | Der Client verbindet sich mit dem Server |
| Client | | Der Benutzer gibt nun eine Chat-Nachricht ein. |
| Client | | Der Client sendet die eingegebene Nachricht (=String) an den Server |
| Server | | Der Server nimmt die empfangene Nachricht entgegen, und verteilt sie nun an alle Clienten |
| Client | | Alle Clienten erhalten nun die Nachricht vom Server (den zuvor eingegebenen Text), und geben diese aus |
Dieser Aufbau zeigt das Grundprinzip. Gehen wir nun etwas näher auf den
Server-Ablauf ein:
| Vorgang | Benötigte Befehle |
| Ein Client baut eine Verbindung auf | Startparameter für den Server: -sv -port 2300 -sn chat |
| Es wird eine Nachricht vom Client erhalten und muss nun an alle gesendet werden | send_string(string); |
| Ein Client trennt die Verbindung | Keine (Wird automatisch durchgeführt) |
Betrachten wir nun den Ablauf des
Clienten etwas näher:
| Vorgang | Benötigte Befehle |
| Es wird eine Verbindung zum Server aufgebaut | Startparameter für den Clienten: -cl -port 2300 -sn chat -ip xxx.xxx.xxx.xxx |
| Der Benutzer gibt einen String ein | inkey(string); |
| Der String wird an den Server gesendet | send_string(string); |
| Ein String wird empfangen; Dieser wird nun an den Nachrichten-Verlauf angehängt. | str_cat(string1,string2); |
Zwar kann man aus diesen Vorüberlegungen wohl eher noch kein Chat-System programmieren, doch geben diese bereits Anregungen, was noch auf uns zukommt. Ich habe hier einen einfachen Quelltext für den Server bereitgestellt und alle wichtigen Unterpunkte mit Kommentaren versehen:
string nachricht[100]; // Der String, der die Nachrichten enthält string verlauf; // Der String, der den Nachrichtenverlauf enthält string eingabe; // Der String, in den eine Nachricht eingegeben werden kann string name="Irgendwer"; // Der String, der den Namen des Users beinhaltet
function main() // Die Hauptfunktion { fps_max=60; // Limitierung der FPS while(1) // Eine Endlosschleife zum abfangen der Daten { if(str_cmp(nachricht,"")!=1) // Der Nachrichten-String ist nicht leer?! { send_string(nachricht); // Sende den Nachrichten-String an alle str_cpy(nachricht,""); // Dann lösche den Inhalt daraus wieder } wait(1); // Warte 1 Frame (1/60 Sekunde) } }
|
Der Code des Clienten ist aufgrund der Anzeigen ein wenig umfangreicher:
string nachricht[100]; // Der String, der die Nachrichten enthält string verlauf; // Der String, der den Nachrichtenverlauf enthält string eingabe; // Der String, in den eine Nachricht eingegeben werden kann string name="Irgendwer"; // Der String, der den namen des Users beinhaltet
function eingeben(); // Deklaration der Funktion "eingeben"; function main() { fps_max=60; // Limitierung der FPS on_enter=eingeben; // Bei drücken von Enter ist es möglich, eine Nachricht einzugeben screen_color=1; // Hintergrund Schwarz while(1) // Endlosschleife zum Abfangen der Daten { if(str_cmp(nachricht,"")!=1) // Der Nachrichten-String ist nicht leer?! { str_cat(verlauf,"n"); // Füge dem Nachrichtenverlauf eine neue Zeile an str_cat(verlauf,nachricht); // Und füge in diese Zeile die neue Nachricht str_cpy(nachricht,""); // Dann lösche den Inhalt der Nachricht wieder } wait(1); // Warte 1 Frame (1/60 Sekunde) } }
function eingeben() // Die Eingabe-Funktion { inkey(eingabe); // Eingabe der Nachricht str_cpy(nachricht,name); // Kopiere zunächst den Nicknamen in die Nachricht str_cat(nachricht,": "); // Hänge nun ein : an str_cat(nachricht,eingabe); // Und schließlich die eingegebene Nachricht send_string(nachricht); // Nun sende die Nachricht an den Server str_cpy(nachricht,""); // Nun lösche die Nachricht zunächst wieder str_cpy(eingabe,""); // Und auch die Eingabe... }
font meine_schrift="Lucida Console",0,12; // Deklaration der Schriftart text nachrichten_text { font=meine_schrift; pos_x=5; pos_y=10; string=verlauf; // Ausgabe des Nachrichtenverlaufs flags=visible; // Standardmäßig sichtbar } text eingabe_text { font=meine_schrift; pos_x=5; pos_y=460; // Weit unten string=eingabe; // Ausgabe der eingegebenen Nachricht flags=visible; // Standardmäßig sichtbar } |