![]() |
SoNIC - A lightweight network library Version 0.3b 17.09.08
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
für ein größeres Projekt arbeite ich zurzeit an einer Netzwerkbibliothek, die es irgendwann mal mit Indy aufnehmen können soll. Das ganze funktioniert auch schon soweit gut, wie gut das allerdings wirklich läuft sieht man natürlich nur im Praxistest. Deswegen würde ich euch bitten, das Ganze einmal zu testen und mir eure "Erfahrungsberichte" mitzuteilen. Eine detaillierte, englische Beschreibung befindet sich auf ![]() Features
Klassen Zur Zeit zur Verfügung stehende Klassen sind: TsoUDP: ein UDP-Socket, der an einen Port gebunden werden kann, oder einfach nur Daten durch die Gegend schleudern kann. TsoTCPClient: ein TCP-Client, der sich zu einem Server verbinden kann. TsoTCPServer: ein TCP-Server, der auf einem Port hockt und Daten empfängt, sowie die Clients verwaltet. Was noch fehlt Es fehlt noch ein TCP-Server (Siehe Changelog), außerdem sind die Send-/ReadStream-Methoden noch nicht implementiert. (Siehe Changelog) Das ganze soll noch Plattformunabhängig werden und auch etwas benutzerfreundlicher. Außerdem will ich die Windows aus den uses hauen. Benutzung UDP: Man nehme ein TsoUDP-Objekt und erstelle es mit
Delphi-Quellcode:
Möchte man etwas verschicken, so muss man zunächst den Host und den Port setzen:
myUDP := TsoUDP.Create;
Delphi-Quellcode:
Und anschließend eine Send-Funktion seiner Wahl aufrufen.
myUDP.Host := 'mein.host.de';
myUDP.Port := '42'; Es gibt zur Zeit:
Delphi-Quellcode:
Also zum Beispiel:
procedure SendBuffer(var a; length: Integer);
procedure SendByte(a: Byte); procedure SendWord(a: Word); procedure SendInteger(a: Integer); procedure SendCardinal(a: Cardinal); procedure SendChar(a: Char); procedure SendString(a: String); procedure SendLine(a: String); // ab Version 0.2 procedure SendStream(a: TStream; length: Integer; bFromBeginning: Boolean = true); // ab Version 0.3
Delphi-Quellcode:
Zum Empfangen muss man zunächst den OnData-Callback setzen:
myUDP.SendByte(42);
Delphi-Quellcode:
Der Sender enthält das sendende Objekt, in diesem Fall wird es nur myUDP sein. Damit kann man eine Callbackfunktion für mehrere Sockets verwenden. Das AFrom-Struct enthält IP und Port des Senders, damit man diese Unterscheiden kann.
procedure TMyForm.OnData(sender: TsoSocket; afrom: TsoSender);
... myUDP.OnData := MyForm.OnData; Damit die Callback-Funktiona auch aufgerufen werden kann, muss regelmäßig
Delphi-Quellcode:
Das kann man entweder in einem Timer, oder besser noch in einem Thread erledigen.
myUDP.CheckData;
Wird das OnData-Event aufgerufen, kann man mithilfe der Read-Methoden Daten lesen. Momentan gibt es folgende Read-Methoden:
Delphi-Quellcode:
Zum Beispiel:
procedure ReadBuffer(var a; length: Integer);
function ReadByte: Byte; function ReadWord: Word; function ReadInteger: Integer; function ReadCardinal: Cardinal; function ReadChar: Char; function ReadString: String; function ReadLine: String; // ab Version 0.2 procedure ReadStream(a: TStream; length: Integer; bFromBeginning: Boolean = true); // ab Version 0.3
Delphi-Quellcode:
Um auf einem bestimmten Port auf eingehende Pakete zu Lauschen, ruft man einfach die Methode Listen auf. das bindet den UDP-Socket an einen Port und wenn man möchte, auch an eine bestimmte Adresse. Der Rest bleibt gleich
procedure TForm1.SonicData(sender: TsoSocket; afrom: TsoSender);
var a: Byte; begin a := myUDP.readByte; ShowMessage(IntToStr(a) + ' from '+ AFrom.IP); end;
Delphi-Quellcode:
Bei TCP ändert sich nicht viel.
myUDP.Listen(42);
Das Erzeugen:
Delphi-Quellcode:
Connect ist blockierend und friert den Thread ein, bis entweder ein Timeout einsetzt oder eine Verbindung zustande gekommen ist.
myTCP := TsoTCPClient.Create;
myTCP.Host := 'mein.host.com'; myTCP.Port := 42; myTCP.Connect; OnData wird wieder gefeuert, wenn Daten ankommen (vorausgesetzt man ruft CheckData auf) und mithilfe der Send und Read-Methoden können Daten versendet werden Disconnect beendet die Verbindung und mithilfe von .Connected kann geprüft werden, ob eine Verbindung besteht. Ein TCP-Server (neu ab Version 0.2) wird folgendermaßen benutzt: Zunächst wird ein Server erzeugt, der Port gesetzt und eventuell Callbackfunktionen zugewiesen. Die Property Host kann ebenfalls gesetzt werden, in dem Fall wird der Server an diese Adresse gebunden.
Delphi-Quellcode:
Neu ist hier das OnConnect, das aufgerufen wird, wenn eine neue Verbindung eingeht. Sie enthält eine var-Variable Accept, die, auf false gesetzt, den Verbindungsvorgang abblockt.
SonicServer := TsoTCPServer.Create;
SonicServer.Port := 42; SonicServer.OnData := MyData; SonicServer.OnConnect := MyConnect; SonicServer.OnError := MyError; Um den Server zu aktivieren, muss die Property Active auf true gesetzt werden:
Delphi-Quellcode:
Sendet jetzt ein Client etwas, wieder vorausgesetzt CheckData wird regelmäßig aufgerufen, wird OnData aufgerufen.
SonicServer.Active := true;
Zu guter letzt noch zur Fehlerbehandlung. Bei sämtlichen Fehlern wird, sofern zugewiesen, das OnError-Event gefeuert.
Delphi-Quellcode:
ErrorCode enthält die Fehlernummer, die ausgewertet - zB mit SysErrorMessage angezeigt - werden kann.
procedure SonicServerError(sender: TsoBaseSocket; ErrorCode: Integer);
Außerdem gibt's noch eine OnDisconnect-Funktion So, viel Spaß beim Herumspielen :hi: Changelog Version 0.3 16.09.2008
Changelog Version 0.2 08.09.2008
Todo:
|
Re: SoNIC - A lightweight network library Version 0.1
Werde ich mir in den nächsten Tagen sicher mal ansehen, könnt ich auch in der Delphi-AG in meiner Schule verwenden, mal sehen. Sieht auf jeden Fall interessant aus und ich hoffe du arbeitest weiter daran, denn ein TCP Server wär schon schön.
[OT]Irgendwie erinnert mich der Name an eine Videospielfigur :gruebel:[/OT] |
Re: SoNIC - A lightweight network library Version 0.1
Ich werde das ganze auch mal in meinem nächsten Projekt testen.
Zitat:
|
Re: SoNIC - A lightweight network library Version 0.1
Endlich mal jemand der sich mal an eine schöne Version der Indys traut! (ich persönlich halte nicht so das meiste von den indys...)
Ich hatte auch mal überlegt mich an sowas ran zu machen. Aber irgendwie kam ich da bisher nie zu. Ich werd das ganze gleich mal testen. Interessant fände ich wenn der TCP Client auch direkt als Server fungiert. Ich finde es irgendwie immer deppert 2 Komponenten für eigentlich eine Funktion (kommunikation zwischen 2 Rechnern) zu benutzen. Gruß Reli |
Re: SoNIC - A lightweight network library Version 0.1
Zitat:
Zitat:
Zitat:
PS: Eine kleine UDP-Socket-Kompo hatte ich auch mal irgendwo hier in der DP :gruebel: Edit: ![]() |
Re: SoNIC - A lightweight network library Version 0.1
Welche Ereignisse soll es denn geben? Die SendGeschichten sind ja Brot und Butter, das Alleinstellungsmerkmal sind die Ereignisse, und ich hoffe du verzichtest auf diese seltsame Antifreeze Geschichte. Orientier Dich mal lieber nicht an den Indys, sondern an den WSocket-Komponenten von F. Piette. Die sind wirklich schlank und funktional.
Aber das ist wohl am Ende Geschmackssache. ;) Und Hauptsache Du hast Spaß dabei und es bringt Dir was. Sherlock |
Re: SoNIC - A lightweight network library Version 0.1
Sherlock wo gibtsn die Kompos? Mag mich auch mal anschauen :-)
|
Re: SoNIC - A lightweight network library Version 0.1
![]() |
Re: SoNIC - A lightweight network library Version 0.1
Du bist zwar nicht Sherlock aber danke trotzdem :zwinker: :cheers:
|
Re: SoNIC - A lightweight network library Version 0.1
Tatsache, ich bin es nicht :mrgreen: :cheers:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz