Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Do 16.11.06 23:52 
Narses´ Netzwerk-Tutorials - Navigation
  1. FAQ-Beitrag: Socket-Komponenten nachinstallieren (ab D7)
  2. Netzwerk-Basics - Minimaler Chat für Anfänger
  3. Terminatorzeichen-Protokoll - Grundlagen (Teil 1)
  4. Terminatorzeichen-Protokoll - Erweiterungen (Teil 2)
  5. hier :arrow: Binär-Protokoll - Für Fortgeschrittene
  6. Netzwerk-Spiel - Multiplayer TicTacToe
  7. UDP LAN-Chat - Der Chat ohne Server
Binär-Protokoll-Tutorial - Für Fortgeschrittene

In diesem Tutorial wird ausführlich erläutert, was ein binäres von einem textorientierten Protokoll unterscheidet. Es wird insbesondere auf den Binärdatentransfer (Datei- und Bilddatenübertragung) eingegangen. Der Code baut auf den TServerSocket-/TClientSocket-Komponenten auf. Kleine Warnung: Das Tutorial hat ganz knapp über 100 Seiten und geht vom Anspruch her davon aus, dass man keine Probleme mit den beiden Terminatorzeichen-Protokoll-Tutorials (mehr) hat! ;)

Im ersten Teil des Tutorials wird eine universell einsetzbare Unit entwickelt, um die immer gleichen Aufgaben bei der Netzwerkkommunikation ohne großen Aufwand wiederverwendbar zu machen.

Im zweiten Teil wird eine Beispielanwendung entwickelt: Ein Client-Server-Chat-System mit Dateiübertragung (im Hintergrund; der Chat wird dabei nicht unterbrochen!) und "Gemeinsam-Zeichnen"-Funktion ("Mal-Chat").

Kurzüberblick über die Themen in diesem Tutorial:
  • Wiederholung: Grundlegende Protokollaufgaben
  • Einführung: Binärdatenverarbeitung
  • Serialisierung von strukturierten Daten und der Weg wieder zurück
  • Universelle Kommandotoken: wie komme ich ohne Syntax-Array aus!
  • Warteschlangen für ein- und ausgehende Daten
  • Die ereignisgesteuerte Datenpumpe
  • Quality-of-Service (QoS): Bandbreitenbegrenzung des Senders
  • automatische Verwaltung einer Sitzungskennung (Session-ID) im Server

Viel Erfolg damit,

cu
Narses


History:

V1.00 vom 16.11.2006:
Erste öffentliche Version.

Kommentare zum Tut sind hier durchaus erwünscht!

Hinweis: Falls die Anhänge unten nicht da sind, Seite (ggfs. auch mehrfach) neu laden, dann tauchen die Anhänge irgendwann auf.

Achtung! Das Tutorial ist nicht für Unicode-Delphi-Versionen geeignet (also ab D2k9). Das wird sich auch nicht mehr ändern, ist einfach zu viel Arbeit, das ganze neu zu machen. :nixweiss: Es gibt aber eine D2010-fähige Version der TNBFPA-Komponenten, siehe die folgenden beiden Beiträge. :idea:
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am Sa 17.05.14 12:18, insgesamt 5-mal bearbeitet

Für diesen Beitrag haben gedankt: darius83, LuMa86
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Do 22.03.07 02:16 
Moin!

Mittlerweile gibt es auch eine integrierte Komponenten-Version des im obigen Tutorial vorgestellten TProtocolAdapter, so dass sich die Einbindung von Protokoll-Funktionen in der Netzwerkkommunikation auf ein paar Mausklicks in der IDE beschränkt. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Fr 06.04.07 12:04 
Moin!

Hier die Version des im Tutorial entwickelten Mal-FileTransfer-Chats mit den neuen TNBFPA-Komponenten, um mal ein konkretes Anwendungsbeispiel im Vergleich zu haben. ;)

Die Kompos werden hier allerdings nicht voll designgerecht verwendet, weil ich so nah wie möglich am Originalcode des Tuts bleiben wollte. :mahn: Dazu mehr im nächsten Tutorial mit den Kompos. :P

cu
Narses

//EDIT: Update des Quelltextes an die Kompo-Version 1.10 (.Add(Buf,Len) -> .AddBuf())
//EDIT2: Update des Quelltextes an die Kompo-Version 1.20 (Unicode-save)
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am Sa 17.05.14 12:18, insgesamt 4-mal bearbeitet
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 13.04.07 00:30 
Spontan ist mir in der kompilierten Demo ein Fehler aufgefallen:
Wenn ich mit einem Client bereits ein Bild angefangen habe zu malen und dann mit einem zweiten Client verbinde und malen will, wird das bereits begonnene Bild nicht an den neuen Client gesendet. Lässt sich manuell natürlich mit Bild komplett senden wieder ausgleichen.
Vielen Dank für deine Anstrengungen! Gerade das Binär-Protokoll Tutorial fand und finde ich sehr interessant, auch wenn ich nicht von meinem Zeichenkettenprotokoll weggehen werde ;) (hat aber auch seine Gründe, BenBE hatte da ja mal in nem Thread zu neulich recht aktiv mitdiskutiert, glaub mit dir und DGL-Luke)

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Fr 13.04.07 01:29 
Moin!

user profile iconalias5000 hat folgendes geschrieben:
Wenn ich mit einem Client bereits ein Bild angefangen habe zu malen und dann mit einem zweiten Client verbinde und malen will, wird das bereits begonnene Bild nicht an den neuen Client gesendet. Lässt sich manuell natürlich mit Bild komplett senden wieder ausgleichen.

Das ist kein Fehler, das ist Design. ;) Ernsthaft, wird auch so im Tut beschrieben, da die Transferlast für das komplette Bild (wenn man´s dann auch noch in Farbe macht, ist das auch noch schlimmer!) recht hoch sein kann, wird das nur "auf Kommando" ausgeführt, damit die Serverlast nicht unnötig stark ansteigt, wenn man eine hohe Client-Fluktuation hat. :idea:

user profile iconalias5000 hat folgendes geschrieben:
Vielen Dank für deine Anstrengungen! Gerade das Binär-Protokoll Tutorial fand und finde ich sehr interessant,

Danke für das Lob! :D

user profile iconalias5000 hat folgendes geschrieben:
auch wenn ich nicht von meinem Zeichenkettenprotokoll weggehen werde ;)

Das habe ich weder erwartet noch bezwecken wollen. ;) (s.u.)

user profile iconalias5000 hat folgendes geschrieben:
(hat aber auch seine Gründe, BenBE hatte da ja mal in nem Thread zu neulich recht aktiv mitdiskutiert, glaub mit dir und DGL-Luke)

Selbstverständlich gibt es immer gute Gründe für beide Ansätze (TermChar+CounterData), deshalb habe ich ja auch beide präsentiert, um für sich und den Zweck wählen zu können. :zwinker:

Naja, eigentlich hat user profile iconDGL-luke wohl eher "mit sich selbst diskutiert" (diplomatisch formuliert), was user profile iconBenBE mehr moderiert hat :mrgreen: auf das Niveau wollte ich mich nicht einlassen... :| (scheint jemand zu sein, der zwar keinen Beitrag zum Thema leisten kann ["...hab die Grundlagen grad nicht zur Hand..."], aber schonmal weiß, dass alle anderen Unsinn reden... :gruebel:)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 13.04.07 11:47 
user profile iconNarses hat folgendes geschrieben:
user profile iconalias5000 hat folgendes geschrieben:
Wenn ich mit einem Client bereits ein Bild angefangen habe zu malen und dann mit einem zweiten Client verbinde und malen will, wird das bereits begonnene Bild nicht an den neuen Client gesendet. Lässt sich manuell natürlich mit Bild komplett senden wieder ausgleichen.

Das ist kein Fehler, das ist Design. ;) Ernsthaft, wird auch so im Tut beschrieben, da die Transferlast für das komplette Bild (wenn man´s dann auch noch in Farbe macht, ist das auch noch schlimmer!) recht hoch sein kann, wird das nur "auf Kommando" ausgeführt, damit die Serverlast nicht unnötig stark ansteigt, wenn man eine hohe Client-Fluktuation hat. :idea:


Ja stimmt hast recht ;)
Wobei natürlich für eine konkrete richtige Umsetzung das dann schon irgendwie bewältigt werden sollte (also in einer "Produktivumgebung", wenn man das dann so nennen kann).
Aber daran kannste dann erkennen, wer die Demos manippuliert und wer aus dem Tutorial was eigenes entwickelt :mrgreen:

user profile iconNarses hat folgendes geschrieben:
user profile iconalias5000 hat folgendes geschrieben:
auch wenn ich nicht von meinem Zeichenkettenprotokoll weggehen werde ;)

Das habe ich weder erwartet noch bezwecken wollen. ;) (s.u.)


Hatte ich ja mit nem Augenzwinkern gesagt, war nicht wirklich ernst gemeint

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Neotracer64
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.07.07 01:17 
Wie könnte ich jetzt am einfachsten mit den Kompos Datenübertragungen zwischen Server <> Client realisieren?
Die TUserList verwirrt mich etwas, da dort der Server ja nicht drinsteht. Sonst habe ich nirgendwo InStream und Outstream gefunden. Ein Beispiel wäre ganz nett. :)
Danke schonmal im vorraus.
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Fr 13.07.07 01:33 
Moin!

user profile iconNeotracer64 hat folgendes geschrieben:
Wie könnte ich jetzt am einfachsten mit den Kompos Datenübertragungen zwischen Server <> Client realisieren?

Sprichst du jetzt von den TNBFPA-Komponenten oder von den Socket-Kompos (TClient-/TServerSocket)? :gruebel: Abgesehen davon: es werden doch die ganze Zeit Daten zwischen Client und Server ausgetauscht. :nixweiss:

user profile iconNeotracer64 hat folgendes geschrieben:
Die TUserList verwirrt mich etwas, da dort der Server ja nicht drinsteht.

Der Server ist eine transparente Vermittlungsstelle, deshalb macht es keinen Sinn, diesen als Ziel bzw. Endpunkt für irgendwelche Übertragungen vorzusehen. :mahn: Beispiel: Du schickst ja auch keine Daten (schlussendlich) an den ICQ-Server, sondern an einen anderen Benutzer. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Neotracer64
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.07.07 03:34 
Hi Narses,

Ich meine deine Komponente.
Es macht schon Sinn, wenn man als Server eine Datei an mehrere Clients oder nur an einen schicken möchte.
Von Client zu Server macht es schon weniger Sinn, aber ich hatte da so eine Art CVS Idee im Kopf, wo jeder seine Projekt-Dateien auch an den Server schickt, der sie dann verwaltet und mit anderen synchronisiert. Sozusagen als Sammelstelle.
Und komm mir nicht mit dem Argument ein anderes CVS System zu benutzen, dann sage ich dir benutze ein anderes Chat-Protokoll, wie das IRC. ;)
Ich möchte einfach nur ein bisschen rumspielen und mich weiterbilden.

Vlt. hast du eine Idee für mich, wie ich also einen Server <> Client DateiTransfer mit deinen Komponenten am besten hinbekomme?

Danke schonmal im Vorraus. :)

EDIT: Ahh, sorry. Jetzt versteh ich deine Antwort. Ich meinte Übertragungen von Dateien und habe Datenübertragungen gesagt. Entschudlige, ist schon spät. ;)
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Fr 13.07.07 09:34 
Moin!

user profile iconNeotracer64 hat folgendes geschrieben:
Ich meine deine Komponente.

OK, dieser Thread behandelt allerdings das Binär-Protokoll-Tutorial, deshalb bitte im passenden Thread weiterdiskutieren. :mahn: ;) :arrow: Hier geht´s weiter.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
barrais
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 01.10.07 11:10 
Hallo Narses,

ich versuche dein Protokoll-Adapter mit UDP von Indy zu realisieren(nachdem ich es aufgegeben habe, dein eigenen UDP Protokoll mit D5 zu compilieren!), das Problem ist das die Indy-UDP kein OnWrite Ereignis besitzen, kannst du mir vielleicht weiterhelfen?

Danke!
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Mo 01.10.07 12:49 
Moin!

user profile iconbarrais hat folgendes geschrieben:
ich versuche dein Protokoll-Adapter mit UDP von Indy zu realisieren

Ähm, ich glaube, ich habe dein "Problem" noch nicht richtig verstanden :gruebel: Du willst den in diesem Tutorial vorgestellten TCP-Protokoll-Adapter auf (Indy-)UDP umbauen? :shock: Das geht nicht; schlicht, deshalb, weil das im Tutorial verwendete Konzept TCP voraussetzt.

Es wird zwar grundsätzlich möglich sein, auch einen UDP-Protokoll-Adapter zu entwickeln, aber sicher nicht durch einen (wie auch immer gearteten) "Umbau" dieses Ansatzes hier. Das wird auf ein Neudesign hinauslaufen... :?

user profile iconbarrais hat folgendes geschrieben:
(nachdem ich es aufgegeben habe, dein eigenen UDP Protokoll mit D5 zu compilieren!)

Wenn ich es richtig gesehen habe, dann sollte sich der TUdpSockUtil auch unter D5 compilieren lassen, wenn du die Unit-Referenzen anpasst. Ich meine, in einem der letzen Beiträge im entsprechenden Thread sowas gelesen zu haben (kann auch über den Link in die DP gewesen sein).

user profile iconbarrais hat folgendes geschrieben:
das Problem ist das die Indy-UDP kein OnWrite Ereignis besitzen, kannst du mir vielleicht weiterhelfen?

Sorry, die Indy-Kompos sind leider gänzlich verschieden zu den Delphi-Sockets und auch zum TUdpSockUtil, deshalb kann ich dir da leider nicht helfen. :(

Was möchtest du denn machen? Vielleicht versuchst du ja, an der "falschen Stelle" anzusetzen? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
barrais
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 01.10.07 13:21 
hi,

ich habe vor, ein Anwendundungsprogramm zu implementieren, das Messdaten die über Ethernet ankommen speichert und präsentiert.Ich habe UDP ausgesucht, weil:
1. ich dadurch Broadcast Packete wegschicken kann
2. ich noch ein Mikrocontroller Programmieren muss, der diese Messungen durchführt; ein UDP-Stack ist einerseits relativ einfacher zu Programmieren und andererseits nimmt nicht viel Speicherplatz im Anspruch .
3. UDP viel schneller ist, vorallem wenn es um Grosse Datenmengen geht. und was Sicherheit angeht brauche keine Gedanken machen, weil ich das ganze in einem LAN-netz betreiben wird.

Hast du vielleicht eine Idee, wie man deinen Binären Protokoll-Adapter(übrigens: das Tutorial war sehr schön, Respekt!) auf UDP-Socket umbauen kann?

Danke!
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Mo 01.10.07 15:36 
Moin!

user profile iconbarrais hat folgendes geschrieben:
3. UDP viel schneller ist, vorallem wenn es um Grosse Datenmengen geht.

Das ist nicht wirklich korrekt :? Die Transferrate ist bei TCP auch nicht geringer, es gibt hier aber Timeouts, die zu beachten sind. :nixweiss:

user profile iconbarrais hat folgendes geschrieben:
Hast du vielleicht eine Idee, wie man deinen Binären Protokoll-Adapter auf UDP-Socket umbauen kann?

Wie schon gesagt, das wird nix, den Protokoll-Adapter wirst du nicht auf UDP "umbauen" können. Entscheidender Haken: du hast keinen TransferStream von der API, sondern nur Paketzustellung, also bleibt die ganze Sicherungsschicht an dir hängen. Aber, wenn ich deinen Anwendungsfall richtig einschätze, brauchst du das doch auch gar nicht. Deshalb wäre ein einfacheres, paketorientiertes Protokoll für dich möglicherweise viel besser geeignet. :idea:

user profile iconbarrais hat folgendes geschrieben:
(übrigens: das Tutorial war sehr schön, Respekt!)

Danke. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
barrais
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 02.10.07 09:41 
Hallo!

Zitat:
Deshalb wäre ein einfacheres, paketorientiertes Protokoll für dich möglicherweise viel besser geeignet.


Das hört sich sehr gut an!
hast du vielleicht zufällig ein Tutorial dazu geschrieben :roll: !
oder kennst du wo ich das finden könnte?

Vielen dank!

Moderiert von user profile iconNarses: Quote-Tag repariert
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 9569
Erhaltene Danke: 875

W2k .. W7pro
TP3 .. D7pro .. D10.1
BeitragVerfasst: Di 02.10.07 10:25 
Moin!

user profile iconbarrais hat folgendes geschrieben:
hast du vielleicht zufällig ein Tutorial dazu geschrieben :roll: !

Ich habe zwar ein UDP-Tut geschrieben (s.o. im Navigationsbereich), aber das erklärt eigentlich nur die Grundzüge. Wie du dein Protokoll entwirfst, ist natürlich etwas, das dir kein Tutorial zeigen kann - du musst schon selbst wissen, was und wie du das, was du machen willst, letztendlich umsetzt. :nixweiss: Hängt ja eben auch davon ab, was da passieren soll und welche Daten konkret transportiert werden müssen...

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Ravy
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 01.02.08 17:00 
Ein dickes Lob an den Author des Tutorials. Es hat mir sehr weitergeholfen.

Vielen Dank

Ravy
der13geist
Hält's aus hier
Beiträge: 10

Win Vista Ultimate x86
D7 Pro, D2007
BeitragVerfasst: Mi 26.03.08 20:50 
Titel: Kurtze verständniss frage
Moderiert von user profile iconNarses: Aus Internet / Netzwerk hier angehangen am 26.03.2008 um 23:37 Uhr

Guten Tag

Habe hier mal eine kurtze verständniss frage. Ich arbeite grade das Biär Protokoll Tutorial von Narses durch.

Nur eine frage beantwortet mir das tutorial nicht, was aber eine grundlegenheit des tutorials darstell.

der Code schnipsel
ausblenden Delphi-Quelltext
1:
PInteger(@Buffer[1])^ :=					

Also ich verstehe dies zwar aber warum wird das alles in den speicher geschrieben und nicht einfach
ausblenden Delphi-Quelltext
1:
Buffer[1] :=					

geschrieben ?

MfG
Der13Geist

_________________
01 05 54 F4


Zuletzt bearbeitet von der13geist am Mi 26.03.08 21:29, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8693
Erhaltene Danke: 172

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 26.03.08 21:19 
Benutze bitte Delphi-Tags für Source, wirkt etwas übersichtlicher ;-)

Zu besagtem Code-Schnipsel:
Durch den expliziten Typecast auf PInteger erzeugt man einen Zeiger, der auf einen Integer zeigt, der an der Stelle des Puffers platziert ist. Würde man hier einfach nur den Zugriff schreiben, so würde man auf einen Char zugreifen.

Was macht das konkret: Dadurch, dass man dem Compiler sagt, dass an besagter Speicherstelle ein Integer platziert werden soll, kümmert sich der Compiler darum, den Integer vollständig zu schreiben; man muss also nicht selber immer alles schreiben. Bei einem Char müsste man den zu schreibenden Integer erst Byte-für-Byte zerlegen und dann über den Puffer wieder korrekt zusammensetzten.

Kurz gesagt: Man erzwingt einfach eine andere Sicht des Compilers auf den Speicher ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
der13geist
Hält's aus hier
Beiträge: 10

Win Vista Ultimate x86
D7 Pro, D2007
BeitragVerfasst: Mi 26.03.08 21:31 
Nur warum schreibt man es überhaupt in den speicher ?

_________________
01 05 54 F4