TCP Host - Client Chat

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

DA

Betreff: TCP Host - Client Chat

BeitragMi, März 02, 2005 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
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

BeitragDi, Jul 19, 2005 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
hi bei mir läuft der client nicht der sagt immer end if fehlt nur ewo???
 

gamble

BeitragDi, Jul 19, 2005 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Zeile 23, da darf nur EndIf stehen.

DA

BeitragDi, Jul 19, 2005 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 20, 2005 6:39
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

DA

BeitragMi, Jul 20, 2005 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Super ST.
Nur leider geht dein Chat über UDP.
Falls du es noch nicht mitgekriegt hast, der hier ist mit TCP. Wink

Mfg
Deutscher Blitz Basic Chat
 

lettorTrepuS

BeitragMi, Jul 20, 2005 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

DA

BeitragMi, Jul 20, 2005 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Prft. Angeber Wink
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... Smile

Mfg
Deutscher Blitz Basic Chat
 

lettorTrepuS

BeitragMi, Jul 20, 2005 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group