TCP Host - Client Chat
Übersicht

![]() |
DABetreff: TCP Host - Client Chat |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
da ich ja gerade dabei bin mich etwas in TCP zu üben, und ich bei der Durchvorstung des BB Forums kein TCP Chat gefunden habe, wollte ich hier mal meinnen kleinen Chat hinstellen. Ich habe ihn etwas über Dokumentiert, aber das ist ja hoffentlich egal. ![]() Fragen, Lob und Kritik sind wie immer willkommen! Host/Server: Code: [AUSKLAPPEN] ; Host ; Programmiert von DarkAngel Graphics 640, 480, 16, 2 AppTitle "Chat - Host" Const Port = 50000 ; Der Port auf dem der Chat laufen soll. Global a.Client ; Der Type um die Clienten zu speichern Global Stream ; Der gespeicherte Stream Global user_nick$ ; Der Name für den Host Global Server ; Der Server womit alle Clienten Verbunden werden. Type Client Field user$ ; Client-Name Field Stream ; Stream des Clienten End Type Server = CreateTCPServer(Port) ; Der Server wird erstellt. If Server <> 0 Then ; Wen der Server gestartet wurde.... Print "Server wurde gestartet mit dem Port " + port ; ...gibts ein Ok. Else ; Wen der Server nicht gestartet wurde... Print "Server wurde nicht gestartet mit dem Port " + port ; ...wird kein Ok gegeben und das Programm wird beendet. WaitKey() ; Auf Tastendruck warten. End EndIf Print "Bitte geben Sie ihren Nick-Namen ein:" user_nick$ = Input("> ") ; Der Nick-Name soll eingegeben werden für den Host. If user_nick$ = "" Then End ; Wen keine Eingabe erfolgt ist, wird beendet. While Not KeyHit(1) ; ###### Hauptschleife ###### message$ = "" ; Jede Runde entleeren! strStream = AcceptTCPStream(Server) ; Jedes mal nachfragen, ob ein neuer Client dazu gekommen ist. Draw_Clients() ; Schreibt alle Clienten die in dem Chat sind. If strStream Then ; Wen strStream nicht 0 ist, ist ein neuer Client dazu gekommen. Stream = strStream ; Die Client ID wird gespeichert. Die brauchen wir nämlich noch zum verschicken. If ReadAvail(strStream) Then ; Jetzt gucken wir, ob der Client uns was geschickt hat. message$ = ReadLine$(strStream) ; Wen ja, lesen wir die erste Zeile aus in dem Stream. EndIf Else ; Wen strStream = 0 beträgt, wird nur abgefragt ob ein Client uns was geschickt hat. For a = Each Client ; Alle Clienten auslesen... If ReadAvail(a\Stream) Then ; ...gucken ob in einem Stream eine Nachricht für uns da ist. message$ = ReadLine$(a\Stream) ; Wen ja, wird der Stream wieder ausgelesen. Stream = a\Stream ; Jetzt noch den Stream speichern. EndIf Next EndIf If message$ <> "" Then ; Wen ein neuer Client da ist, oder eine Nachricht an uns gesendet wurde, ist message$ <> ""! Select message$ ; Der Client hat uns vorhin eine Zahl geschickt. Diese zahl sagt dem Server, was für eine Nachricht das ist. Case "1" ; War in der Nachricht eine 1, so sagt der Client uns das er in den Chat gekommen ist. user_name$ = ReadLine$(strStream) ; Name des Clienten auslesen, den der Client uns geschickt hat. a.Client = New Client ; Einen neuen Clienten in unsere Clienten-"Datenbank" aufnehmen. a\user$ = user_name$ ; Name des Clienten in den Type speichern. a\Stream = strStream ; Stream des Clienten in den Type speichern. Print user_name$ + " kommt in den Chat geflogen." ; Und jetzt noch auf den Bildschirm schreiben, das ein neuer Client da ist. Case "2" ; War in der Nachricht eine 2, so sagt der Client uns das er eine Nachricht geschickt hat. user_name$ = ReadLine$(Stream) ; Name des Clienten aus dem Stream lesen. New_message$ = ReadLine$(Stream) ; Jetzt die Nachricht aus dem Stream lesen. Print user_name$ + ": " + New_message$ ; Die Nachricht ausgeben. For a = Each Client ; Da der Client nur dem Server die Nachricht geschickt hat, müssen wir die Nachricht an alle anderen Clienten weiterleiten. If Not a\Stream = Stream Then ; Damit der Client, der uns die Nachricht geschickt hat, nicht nochmal die Nachricht kriegt, filtern wie ihn raus. WriteLine a\Stream, "1" ; Jetzt schreiben wir in dem Stream, das die folgenden Zeilen, eine Nachricht ist. WriteLine a\Stream, user$ ; Name mit in den Stream schreiben, damit der andere Client auch weiß, von wem die Nachricht ist. WriteLine a\Stream, New_message$ ; Jetzt wird die eigentliche Nachricht gesendet. EndIf ; Alles wieder schön verpacken.... Next Case "3" ; War in der Nachricht eine 3, so sagt der Client uns das er den Chat jetzt verlässt. user$ = ReadLine$(Stream) ; Den Namen des verlassenden Clienten auslesen. quit$ = ReadLine$(Stream) ; Eine letzte Nachricht noch, bevor er geht. Color 255, 0, 0 ; Die Schriftfarbe auf rot setzen. Print user$ + " hat den Chat verlassen: " + quit$ ; Die Nachricht ausgeben, dass der Client gegangen ist, und seine Nachricht noch hinten dranhängen. For a = Each Client ; Da der Client dem Server nur geschrieben hat, dass er gegangen ist, müssen wir an die anderen Clienten schreiben, dass der Client gegangen ist. If Not a\Stream = Stream Then ; Damit wir nicht noch unnötige Nachrichten verschicken, senden wir die Nachricht nur an die Clienten die noch online sind. WriteLine a\stream, "3" ; Schnell die Zahl noch schreiben, damit die Clienten wissen, um welche Art es sich bei der Nachricht handelt. WriteLine a\stream, user$ ; Den Namen des gegangenen Clienten noch verschicken... WriteLine a\stream, quit$ ; ...und die letzte Nachricht noch hinterher. EndIf Next ; Alles wieder schön schließen... For a = Each Client ; Da der Client ja nicht mehr da ist, löschen wir ihn aus unserer "Datenbank". If a\user$ = user$ Then ; Damit nicht alle Clienten gelöscht werden, filtern wir den gegangenen Clienten heraus. Delete a.Client ; Wen wir ihn gefunden haben, löschen wir ihn. EndIf Next Color 255, 255, 255 ; Damit die Schrift nicht für immer rot bleibt, stellen wir sie zurück auf weiß. End Select EndIf ; Und wieder alles schließen. If KeyDown(57) Then ; Da wir ja auch zu den Clienten schreiben wollen, müssen wir dazu auch eine Funktion machen. While KeyDown(57) ; Wen also die Leertaste gedrückt wurde, filtert er alle Leerzeichen heraus. Wen wir das nicht machen würden, würde nach dem verschicken sich sofort eine neue Eingabeaufforderung öffnen. Wend write_message$ = Input$("> ") ; So, jetzt fragen wir nach der Nachricht, die versendet werden soll. For a = Each Client ; Wen die Nachricht eingeben wurde, schicken wir die Nachricht direkt an alle Clienten. WriteLine a\Stream, "1" ; Die 1 schreiben, damit die Clienten wissen, um welche Art es sich bei der Nachricht handelt. WriteLine a\Stream, user_nick$ ; Wieder den Namen schreiben, damit die Clienten wissen von wem die Nachricht stammt. WriteLine a\Stream, Write_message$ ; Jetzt noch die Nachricht senden, die wir eingegeben haben. Next EndIf Wend ; ###### Ende Hauptschleife ###### ; So, wen der Server nur beendet wurde, wird an alle Clienten die sich noch im Chat befinden, eine Nachricht... ; ...geschickt. Diese Nachricht teilt ihnen mit, das der Server beendet wurde. Wen der Server beendet wird,.... ; wird der Chat beendet. Color 0, 255, 0 ; Diesmal grüne Farbe wählen. Print "Bitte geben Sie ihre Abschietsnachricht ein:" Dis_message$ = Input$("> ") ; Eine letzte Nachricht noch abfragen... For a = Each Client ; ..und an alle Clienten senden. If Not a\Stream = "" Then WriteLine a\Stream, "4" ; Wieder die Zahl senden, um was für eine Nachricht es sich handelt.... WriteLine a\Stream, user_nick$ ; ....Name nicht vergessen... WriteLine a\Stream, Dis_message$ ; ...und die letzte Nachricht natürlich auch nicht. EndIf Next ; alles wieder schön verpacken. End ; Und beenden. Function Draw_Clients() Text 500, 20, "User in dem Chat:" ; Überschrift schreiben y = 20 ; Variable auf 20 setzen. For a = Each Client ; Alle Clienten auslesen. y = y + 20 ; Bei jedem Durchgang die Variable + 20 addieren. Text 500, y, a\user$ ; Die Clienten untereinander schreiben. Next End Function Client: Code: [AUSKLAPPEN] ; Client ; Programmiert von DarkAngel Graphics 640, 480, 16, 2 AppTitle "Chat - Client" Const Port = 50000 ; Der Port auf dem der Chat laufen soll. Const IP_Server$ = "127.0.0.1" ; Die IP addresse des Hostes/Servers. Global Client_user$ ; Der Nick-Name von dem Clienten. Print "Bitte geben Sie ihren Nick-Namen ein:" Client_user$ = Input$("> ") ; Nick-Namen eingeben. If Client_user$ = "" Then End ; Wen der Nick-Name leer ist, wird beendet. ; ### Wichtig ### ; Wen der Chat übers Internet laufen soll, müssen Sie die IP addresse des Hostes/Server dort einfügen. strmClient = OpenTCPStream(IP_Server$,Port) ; Client verbindet sich mit dem Host/Server. If strmClient <> 0 Then ; Wen strmClient kleiner oder größer als 0,... Print "Client wurde Verbunden!" ; ... dan wurde der Client verbunden. Else ; Wen strmClient = 0 ist,.... Print "Client wurde nicht Verbunden! - Bitte drücken Sie eine Taste." ; ... konnte der Client nicht Verbunden werden. WaitKey() End End If WriteLine strmClient, "1" ; Dem Host/Server melden das der Client verbunden ist.... WriteLine strmClient, Client_user$ ; ... und gleich den Nick-Namen mit senden. While Not KeyHit(1) ; ###### Hauptschleife ###### If ReadAvail(strmClient) Then ; Wen eine Nachricht im Speicher liegt... message$ = ReadLine$(strmClient) ; ... dan wird die erste Zeile ausgelesen. Select message$ Case "1" ; Wen in dem Speicher eine 1 war, dann ist eine neue Nachricht von dem Host/Server gekommen. user$ = ReadLine$(strmClient) ; Name des Clienten/Host herauslesen. New_message$ = ReadLine$(strmClient) ; Die neue Nachricht auslesen. Print user$ + ": " + new_message$ ; Und alles auf den Bildschirm schreiben. Case "2" ; Wen in dem Speicher eine 2 war, dann ist ein neuer Client in den Chat gekommen. user$ = ReadLine$(strmClient) ; Name des Clienten herauslesen. Print user$ + " kommt in den Chat geflogen" ; Und wieder alles auf den Bildschirm schreiben. Case "3" ; Wen in dem Speicher eine 3 war, dann hat ein Client den Chat verlassen. user$ = ReadLine$(strmClient) ; Name des gegangenen Clienten aus dem Stream lesen. quit$ = ReadLine$(strmClient) ; Die letzte Nachricht aus dem Stream lesen. Color 255, 0, 0 ; Schriftfarbe auf rot setzen. Print user$ + " hat den Chat verlassen: " + quit$ ; Und die Quit Nachricht auf den Bildschrim schreiben in rot. Color 255, 255, 255 ; Die Schriftfarbe wieder auf weiß setzen. Case "4" ; Wen in dem Speicher eine 4 war, dann ist der Server gegangen und die Verbindung ist gekappt worden. Server_user$ = ReadLine$(strmClient) ; Name des Hostes/Servers herausfinden. quit$ = ReadLine$(strmClient) ; Die letzte Nachricht herauslesen. Print "Der Server wurde von " + Server_user$ + " beendet: " + quit$ ; Alles wieder auf den Bildschirm zeichen. Color 255, 0, 0 ; Die Schriftfarbe wieder auf rot setzen. Print "Der Server wurde beendet. Drücken Sie eine Taste um zu beenden." ; Und dem Clienten mitteilen, das die Verbindung gekappt wurde. WaitKey() End End Select EndIf If KeyDown(57) Then ; Da wir ja auch zu den anderen Clienten oder Host/Server schreiben wollen, müssen wir dazu auch eine Funktion machen. While KeyDown(57) ; Wen also die Leertaste gedrückt wurde, filtert er alle Leerzeichen heraus. Wen wir das nicht machen würden, würde nach dem verschicken sich sofort eine neue Eingabeaufforderung öffnen. Wend write_message$ = Input$("> ") ; So, jetzt fragen wir nach der Nachricht, die versendet werden soll. WriteLine strmClient, "2" ; Die 2 schreiben, damit der Host/Server weiß, um welche Art der Nachricht es sich hier handelt. WriteLine strmClient, Client_user$ ; Wieder den Namen schreiben, damit die Clienten wissen von wem die Nachricht stammt. WriteLine strmClient, Write_message$ ; Jetzt noch die Nachricht senden, die wir eingegeben haben. EndIf Wend ; ###### Ende Hauptschleife ###### Color 0, 255, 0 ; Die Schriftfarbe auf grün setzen. Print "Bitte geben Sie ihre Abschietsnachricht ein:" Dis_message$ = Input$("> ") ; Die letzte Nachricht muss eingegeben werden. WriteLine strmClient, "3" ; An den Host/Server eine Nummer schicken. WriteLine strmClient, Client_user$ ; Den Namen des Clienten noch hinterher schicken. WriteLine strmClient, Dis_message$ ; Und die Quit Nachricht nicht vergessen. CloseTCPStream strmClient ; Stream beenden End ; Ende Ich hoffe jemand kann damit was anfangen. Ich denke, ich werde in ein paar Tagen nochmal eine erweiterte Version des Chattes hier hinstellen. Thx DarkAngel |
||
Deutscher Blitz Basic Chat |
- Zuletzt bearbeitet von DA am Mi, Jul 20, 2005 10:59, insgesamt 3-mal bearbeitet
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi bei mir läuft der client nicht der sagt immer end if fehlt nur ewo??? | ||
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zeile 23, da darf nur EndIf stehen. | ||
![]() |
DA |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
Jo. Ich habs editiert doch steht immer noch so. Egal was ich mach. Vielleicht könnte sich das mal nen Admin oder so angucken? Mfg |
||
Deutscher Blitz Basic Chat |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
DA |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
Super ST. Nur leider geht dein Chat über UDP. Falls du es noch nicht mitgekriegt hast, der hier ist mit TCP. ![]() Mfg |
||
Deutscher Blitz Basic Chat |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
DA |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
Prft. Angeber ![]() Ich denke aber auch das manche leute mehr von meinem Code lernen als von deinem. Mein Code ist ja schon extrem unübersichtlich aber deiner... ![]() Mfg |
||
Deutscher Blitz Basic Chat |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group