Mini Chat - Austausch von Nachrichten

Anfängerfragen zum Programmieren mit PureBasic.
Stromberg
Beiträge: 20
Registriert: 04.06.2006 22:35
Kontaktdaten:

Mini Chat - Austausch von Nachrichten

Beitrag von Stromberg »

Hi,

ich habe mich für mein erstes Projekt mal an einen kleinen Chat gewagt. Der Austausch von Chatbotschaften zwischen Server und den Clients sowie der Abgleich der Liste von Chattern "im Raum" funktionieren soweit.

Nun wollte ich gerne noch einige Zusatzfelder einbauen, die vom Server verändert werden können. Beispielsweise eine InfoBox mit einem Raumnamen und eine weitere mit dem aktuellen Thema.

Allerdings habe ich nun das Problem, dass die Clients die Art der Datenpakete offensichtlich nicht mehr richtig zuordnen können - die Folge ist, dass häufiger Müll in den Gadgets steht.

Bisher regle ich den Austausch mittels eines Prüfbytes, das ich an die Datenpakete anhänge, um dem Empfänger über die Art des Pakets zu informieren. In einigen Beispielen für Chats habe ich gesehen, dass die Pakete in Tags gepackt wurden (also beispielsweise "{MESSAGE}HALLO{\MESSAGE}") - daher meine Frage:

Ist das ein guter Weg? Angekommen ich packe alle Informationen in die entsprechenden Tags, wann und wie oft benutze ich dann die Befehle SendNetworkString bzw. ReceiveNetWorkData; bei jeder Aktion oder nur einmal bei jedem Schleifendurchlauf?

Achja: Derzeit habe ich für jeden neuen Clienten, der sich verbindet einen eignen Buffer eingerichtet - ist das schwachsinnig?

Danke im Voraus!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ Buffer: Ich würde nicht sagen schwachsinnig, aber "unnötig". Denn was, wenn einer eine Nachricht sendet? Schreibt der Sender seine eigene nachricht dann eigenständig in die Gadgets?

Ich wwürde das anders machen: Wenn einer eine Nachricht sendet, dann schickt der Server diese nachricht an alle clienten wiede zurück, also auch an den Sender. Dieses Verfahren kannst du ganz leicht mit einer Schleife ausführen. Ob For/Repeat/ForEach ist ganz egal, aber so brauchst du z. B. keinen Buffer.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Stromberg
Beiträge: 20
Registriert: 04.06.2006 22:35
Kontaktdaten:

Beitrag von Stromberg »

Ich habe das Ganze bereits schon so aufgebaut, wie du es beschrieben hast.

Wenn ein Client eine Nachricht abschickt, wird diese an den Server gesendet. Dieser verarbeitet die Nachricht und sendet anschließend die Nachricht zurück an alle Clienten. Dadurch, dass jeder Client auf dem Server einen eigenen Buffer hat, wollte ich Verwechselungen ausschließen.

Mein Problem ist ja auch nicht, dass die Nachrichten nicht ankommen, sondern dass sie teilweise fehlinterpretiert werden.

Momentan habe ich es so programmiert, dass sobald der Server ein Paket von einem Client erhält, er dieses auswertet und sofort zurücksendet, inklusive einer Kennung am Anfang, die das Paket beispielsweise als Chatmitteilung identifiziert (allerdings ohne Kennung am Ende, was nach meinen Überlegungen auf diese Art überflüssig gewesen wäre).
Ist es besser, alle Auswertungen zunächst hintereinander in den Buffer zu schreiben und erst am Ende der Hauptschleife ein komplettes Paket an die Clients zu versenden? Dann müsste ich natürlich neben der Identifizierung am Anfang auch noch eine am Ende senden.

Meinungen?
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Wie machst du dass eigentlich wenn du neine Nachreicht senderst? Bei SendNetworkString()kann man ja nicht endlos lange nachrichten versicken.

Sendest du die Teile immer einzeln mit SendNetworkString() oder verschickst du das als Datei, oder gibt es da noch einen besseren weg?
Stromberg
Beiträge: 20
Registriert: 04.06.2006 22:35
Kontaktdaten:

Beitrag von Stromberg »

Hmm, endlos lange Nachrichten sind ja auch nicht nötig. Angenommen du hast einen Buffer von 5000 Byte, so sind das immerhin 5000 Zeichen. Das sollte für eine Nachricht reichen. Und wenn nicht, kannste eine längere Eingabe ja vom Programm splitten lassen und stückchenweise senden - oder halt einfach einen größeren Buffer benutzen. :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

in 3.94 sind strings auf 64000 zeichen limitiert, so groß würde ich auch den buffer machen. denn manchmal möchte ich einem freund ja einen längeren text oder quellcode kopieren im chat einfügen und senden, das geht dann nie, das regt mich bei ICQ auch imemr so auf.

ab pb 4.00 sind strings unlimitiert, sodass du deine daten unter umständen auch mit SendNetworkData() senden kannst. den befehl verstehe ich aber selber nicht so ganz; kopiert der einfach nur wie CopyMemory() nur von einem PC aufn anderem?

Wenn ich also einen AllocateMemory() habe und darin einmal PeekL(*buffer, 5) speichere, dann mit SendNetworkdata() sende, und mit ReceiveNetworkData() empfange, habe ich dann auf dem Empfänger-PC im *buffer auch die 5 vom Typ Long gespeichert?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Stromberg
Beiträge: 20
Registriert: 04.06.2006 22:35
Kontaktdaten:

Beitrag von Stromberg »

Mal am Rande: Über ICQ würd ich deinen Programmcode nicht an Freunde schicken - sonst findest du ihn vielleicht später mal wieder. :mrgreen:

Der Knackpunkt hier dürfte AllocateMemory sein. Wenn ich den Befehl richtig interpretiere, musst du ja eine feste Größe definieren. Also könnte man vielleicht ganz einfach zunächst die Länge des Strings bestimmen, der versendet werden soll, und anschließend einfach einen Buffer mit entsprechender Größe definieren. Dann könnte man auch einfach SendNetworkString benutzen.

Hmm, aber das sollte lieber einer beantworten, der's weiß. :) Vielleicht kann der mir ja auch antworten. :(
Zuletzt geändert von Stromberg am 20.06.2006 23:22, insgesamt 1-mal geändert.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Achso dann wusste ich das Falsch, ich habe gedacht man kann nur eine bestimmte Länge von text versenden und der Rest wird abgeschnitten, dann war das bei einem anderen Befehl.


Aber Trotzdem Danke für die Hilf!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Stromberg hat geschrieben:Mal am Rande: Über ICQ würd ich deinen Programm nicht an Freunde schicken - sonst findest du ihn vielleicht später mal wieder. :mrgreen:
Das weiß ich! Es war ja auch nur ein beispiel!


Aber kann mir denn einer meine Frage zu der
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

du hast
PeekL(*buffer, 5)
geschrieben (????). meinst du nicht eher PokeL(...) ?

...warum sollte dass dann nicht gehn (nach der korrektur) ?
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten