Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Toemsel

Treue Seele

  • »Toemsel« ist der Autor dieses Themas

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

1

26.07.2015, 18:45

Network Library

Im Zuge meines neuen Projektes musste eine Netzwerkkommunikation gewährleistet werden. Kurzerhand entschied ich mich eine Netzwerk Bibliothek zu erstellen und diese mit der Öffentlichkeit zu teilen. Bereits bestehende Libraries sind entweder zu komplex oder zu einfach gestrickt. Mein Ziel war es mit wenig Code möglichst viele Funktionalitäten bieten zu können. Zudem mussten die "magic numbers" und die endlos langen "if else" "switch case" Abfragen nach dem Erhalt eines byte arrays ihr Ende finden. Das Resultat: Eine einfache aber effektive Objektorientierte Lösung.


Funktionsweise
Selbst erstellte Klassen die von "Packet" erben, können instanziert, befüllt und anschließend über TCP oder UDP an den Server weitergeleitet werden. Die Netzwerk Library liest mithilfe von Reflection alle vorhandenen Properties aus und schreibt diese mit einem Overhead von 48bit auf den Stream. (16 byte = Paket typ. 32 byte = Paket length) Nach dem erhalt der 48bit wird wiederum Mithilfe von Reflection ein neues Objekt instanziiert und alle Properties der Reihe nach mit den erhaltenen bytes befüllt. Um maximale Performance zu gewährleisten, werden Maps bereits vor dem Verbindungsaufbau erstellt.

Besonderheiten
  • TCP und UDP Unterstützung
  • Arbeiten mit Objekten
  • Sorgenloses Senden und Empfangen
    • Automatische Verbindungswiederherstellung
    • TCP RTT: 15 – 30ms (GAN) *
    • UDP RTT: 5 – 10ms (GAN)
    • TCP RTT: 4 – 10ms (LAN)
    • UDP RTT: 4 – 8ms (LAN)
  • Sehr geringer Overhead, trotz Objektorientierung
  • Eventbasiert
  • Maximal 65536 individuelle Pakete möglich
  • Maximale Paketlänge von 4294967296 bytes. (4,096 GB)
* Best case

Anforderungen
  • .net 4.5 oder höher
Nutzung (Source, Binaries und Examples)
Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU Lesser General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.

Weitere Links
Detaillierter Artikel
Dokumentation
Sourcecode, Beispielprojekt und Binaries

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Toemsel« (04.08.2015, 23:49)


2

27.07.2015, 10:20

Klingt soweit super, nur für welche Sprache ist das?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

27.07.2015, 10:27

Wie schaut denn die Schnittstelle zum Senden/Empfangen von Paketen aus? Spannend wird es ja beim Erhalten der Daten, wenn ich Objekt vom Typ X über die Leitung schicke, erwarte ich ja am anderen Ende Pakete verschiedener Typen. wie finde ich das denn heraus, was ich als Paket bekomme?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

27.07.2015, 11:46

Die Bibliothek klingt der Beschreibung nach durchaus interessant, allerdings kann man erst nach einer Verwendung sagen, wie gut sie tatsächlich zu verwenden ist.

Du könntest mal gucken, in wie weit sich deine Bibliothek in Unity verwenden lässt. Das einzige Problem könnte im Bereich der Netzwerk-API sein, die ggf. von Mono (oder dem für den Player verwendeten Subset) nicht zur Verfügung gestellt wird.
Solltest du dich aber mit Unity beschäftigen, solltest du auch gucken, in wie weit deine Bibliothek sich von anderen, für Unity bereits vorhandenen (bspw. Photon) unterscheidet und unter welchen Umständen deine besser geeignet sein könnte.


@anti-freak:
Die Dokumentation deutet auf .NET hin.

@TrommlBomml:
Ich würde vermuten, dass dafür Typprüfungen erforderlich werden. Oder man implementiert sich alternativ eine Basisklasse, die bestimmte (abstrakte) Methoden definiert, die von den Ableitungen so implementiert werden, dass von deren Rückgabewerten auf den richtigen Typen bzw. die richtige Verwendung geschlossen werden kann.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Toemsel

Treue Seele

  • »Toemsel« ist der Autor dieses Themas

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

5

27.07.2015, 15:09

Klingt soweit super, nur für welche Sprache ist das?
Sacaldur hat das bereits richtig erkannt. .net
Wie schaut denn die Schnittstelle zum Senden/Empfangen von Paketen aus? Spannend wird es ja beim Erhalten der Daten, wenn ich Objekt vom Typ X über die Leitung schicke, erwarte ich ja am anderen Ende Pakete verschiedener Typen. wie finde ich das denn heraus, was ich als Paket bekomme?
Die Pakete werden in einer allgemeinen Bibliothek definiert, wodurch du Server und Clientseitig die selben Pakete aufrufen kannst.
Das jonglieren der Datenpakete übernimmt ebenfalls die Netzwerk Lib. Alles was du definierst sind Delegates, welche nach dem erhalt eines speziellen Types (Polymorphismus) aufgerufen werden.
Die Bibliothek klingt der Beschreibung nach durchaus interessant, allerdings kann man erst nach einer Verwendung sagen, wie gut sie tatsächlich zu verwenden ist.

Du könntest mal gucken, in wie weit sich deine Bibliothek in Unity verwenden lässt. Das einzige Problem könnte im Bereich der Netzwerk-API sein, die ggf. von Mono (oder dem für den Player verwendeten Subset) nicht zur Verfügung gestellt wird.
Solltest du dich aber mit Unity beschäftigen, solltest du auch gucken, in wie weit deine Bibliothek sich von anderen, für Unity bereits vorhandenen (bspw. Photon) unterscheidet und unter welchen Umständen deine besser geeignet sein könnte.


@anti-freak:
Die Dokumentation deutet auf .NET hin.

@TrommlBomml:
Ich würde vermuten, dass dafür Typprüfungen erforderlich werden. Oder man implementiert sich alternativ eine Basisklasse, die bestimmte (abstrakte) Methoden definiert, die von den Ableitungen so implementiert werden, dass von deren Rückgabewerten auf den richtigen Typen bzw. die richtige Verwendung geschlossen werden kann.
Müsste ich einmal überprüfen. Bin kein Fan von Spiele Engines. :S
Ist das Absicht, dass die Webseite so aussieht?
"Ist man sich über eine Aussage nicht sicher, greift man gerne zu 「と思う」か「って思う」。Eine weitere Möglichkeit wäre に違いない。"
Ich kann kein chinesisch.


Gibt es zu der Lizenz auch noch genauere Informationen? Das Copyleft klingt hart und zwingt quasi meine kommerzielle Application dazu, dass sie ebenfalls frei verwendet werden darf, was sie kommerziell nutzlos macht. Allerdings steht da nichts darüber ob das jetzt für den Source gilt oder für Binaries oder für was überhaupt. Aus meiner Sicht ist das ohne genauere Infos komplett nutzlos.
Ja, das ist Absicht. Chinesisch wird dir auch wenig nützen, da es sich um japanisch handelt. Ist mein "Lerntagebuch", sozusagen :rolleyes:
Copyleft für die Source + Binary.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

27.07.2015, 16:34

Hast du mal überlegt für die (De-)Serialisierung eine fertige Lösung wie z.B. Protocol Buffers zu nutzen? Da kannst du potentiell noch einiges an Datengröße drücken. Mich würde auch die benötigte Zeit interessieren. LINQ kenne ich als etwas das man unbedingt vermeiden sollte wenn es auf Millisekunden ankommt.

Toemsel

Treue Seele

  • »Toemsel« ist der Autor dieses Themas

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

7

27.07.2015, 16:40


Und noch immer ist ungeklärt, ob ich jetzt nun den Source veröffentlichen muss, oder ob nur mein Produkt komplett frei (Definition von "frei"?) benutzt werden darf. Nimm doch einfach eine passende Lizenz, wo man das wenigstens beurteilen kann.
General Public License.



Hast du mal überlegt für die (De-)Serialisierung eine fertige Lösung wie z.B. Protocol Buffers zu nutzen? Da kannst du potentiell noch einiges an Datengröße drücken. Mich würde auch die benötigte Zeit interessieren. LINQ kenne ich als etwas das man unbedingt vermeiden sollte wenn es auf Millisekunden ankommt.
(De-)Serialisierung befindet sich im ns bereich. Protocol Buffers haben einen größeren Overhead als meine Methode. Es werden nur Daten, keine Datendefinitionen serialisiert. In diesem Sinne handelt es sich nicht direkt um eine Serialisierung. Daten werden extrahiert und auf dem Stream geschrieben. Ohne Klassen oder Typendefinition. Der Overhead entspricht genau 48bits pro Paket, welcher unabhängig von Pakettyp, länge und Inhalt ist.

Toemsel

Treue Seele

  • »Toemsel« ist der Autor dieses Themas

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

8

05.08.2015, 01:57

User Objekte, Arrays und Listen werden nun auch unterstützt.
Lizenz wurde auf LGPLv3 abgeändert.

Toemsel

Treue Seele

  • »Toemsel« ist der Autor dieses Themas

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

9

13.08.2015, 14:49

Nun auch auf NuGet verfügbar. https://www.nuget.org/packages/Network/
»Toemsel« hat folgendes Bild angehängt:
  • NuGet.PNG

Toemsel

Treue Seele

  • »Toemsel« ist der Autor dieses Themas

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

10

11.02.2016, 22:11

Version 2.0.0.0

Seit dem ersten Post hat sich einiges getan.
Eine Zusammenfassung der Versionen 1.1.1, 1.1.2, 1.1.3, 1.2.0, 1.2.1, 1.3.0 und 2.0.0:
  • ClientConnectionContainer, (TCP und UDP) Datenbehälter für einfacheren Umgang am Client
  • ServerConnectionContainer, Datenbehälter für einfacheren Umgang am Server
  • Bessere Konfiguration der Verbindungen (NoDelay, Routing, Loopback, Checksum, HopLimit, TTL etc.)
  • Generics für leichteres hinzufügen von Methoden
  • Delegates und Lambdas für callbacks möglich
  • Asynchrones senden und empfangen von Daten.
  • Objektorientierung: Senden+Empfangen von gleichen Datenpaketen in mehreren Objekten möglich
Somit steht die Grundfunktion und die Library kann sich schon sehen lassen.
Bald sind 400 Downloads erreicht :thumbsup: Auch wird die Library bereits in Projekten eingesetzt.

Sourcecode, Beispiele, Binaries sind hier erhältlich oder wie gehabt auf NuGet.
Des Weiteren werde ich die nächsten Tage ein Youtube Video hochladen und ein kleines Beispiel programmieren, um die Mächtigkeit und Einfachheit der Library zu demonstrieren.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Toemsel« (11.02.2016, 22:17)


Werbeanzeige