# Netzwerk-Framework gesucht



## siddie (21. Mai 2016)

Hallo zusammen,

wir entwerfen zur Zeit in einem kleinen Team einen etwas anderen Geocache. Dabei wollen wir nicht nur Hinweise und Dosen vor Ort verstecken, sondern das ganze Interaktiv gestalten, per App mit Internetzugang und GPS. Und mehrere Teams die gegeneinander antreten 

Hierfür schreibe ich einen Server in Java der jeweils eine TCP-Verbindung für jeden Teilnehmer aufrecht erhält und die eingehenden Ereignisse verarbeitet / Rückmeldungen gibt. Bisher per NIO/select, was mir aber sehr umständlich erscheint. Ich müsste auch von einer Verbindung aus Nachrichten andere / alle anderen verschicken können. Hier hakt es manchmal noch.
Es wäre auch schön direkt JSON-nachrichten verschicken zu können.

Gibt es für den Anwendungsfall vielleicht schon ein Framework?

Optimal wäre es gleich den passenden Gegenpart für Android zu haben. Und nichts allzu kompliziertes, bin noch einsteiger.

Danke euch!


----------



## dayaftereh (22. Mai 2016)

Hey, also für NIO in Java würde ich sofort Netty einsetzen. Dabei abstrahieren Netty die low Level API von Java und versteckt sie ziemlich nett, nach meiner Meinung. Natürlich musst du dann noch dein eigenes Protokoll entwerfen um Daten mit dem Server aus zu tauschen.

Ich weiß nicht wie dein App aufgebaut ist, aber vielleicht hilft ActiveMQ bzw. ZeroMQ, was JMS umsetzt. Dabei hat es ein eigenes Message Protokoll und bildet eine Art Publish / Subscribe System ab. so könnenen Clients untereinander kommunizieren oder direkt mit dem Server.


----------



## siddie (22. Mai 2016)

Hey, Netty sieht sehr gut aus, damit kann ich mich anfreunden 
ActiveMQ scheint mir etwas zu mächtig zu sein.
Ich experimentiere grad mit GSON, also wandle die Nachricht in einen String und schicke diesen über die Verbindung. Probleme gibt es wenn mehrere Nachrichten (oder nur eine Halbe) beim lesen ankommen. Dann verweigert GSON das decodieren, weil es kein gültiges JSON ist.


----------



## dayaftereh (22. Mai 2016)

Ich habe das gleiche auch mal entwickelt. Da zu habe ich meine Json Nachricht wie folgt aufgebaut.

Header + JsonString

Der Header ist immer 9 Bytes lang und besteht aus

Version (Byte) | Type (int) | Length (int)

Version ist die Protokoll Version= 1
Type ist der Nachrichten Type bzw Klasse für das decodieren mit Gson
Length ist die Länge des Json string in Bytes.
Mit Netty kannst du dir eine Decoder und Encoder Chain aufbauen die deine JsonStrings bzw. Direkt die Objekte zu oder von Bytes konvertiert.

Ps: nutzt du UDP oder TCP ?

EDIT

Hier habe ich schon mit Netty rum gespielt, vielleicht hilft es. https://github.com/dayaftereh/networkcheck


----------



## InfectedBytes (22. Mai 2016)

du könntest auch KryoNet verwenden. Kryonet ist eine Netzwerk Bilbiothek, welche auf dem Serialisierungsframework Kryo aufbaut. 
Dank der Serialisierung kannst du auch ganz bequem Java Objekte verschicken und musst nicht den Umweg über JSON gehen.


----------



## dayaftereh (22. Mai 2016)

Die Idee von @InfectedBytes hat den Nachteil das du nicht mehr Programmiersprachen unabhängig bist. Was für Clients hast du ? Android und iOS Apps ?


----------



## siddie (23. Mai 2016)

Danke euch!

Ich verwende bisher TCP, einfach weil es Nachrichten erlaubt die länger als ein Paket sind und bei Paketverlust erneut überträgt. Die Idee von @dayaftereh sieht schon sehr gut aus, das werde ich als kleine Programmieraufgabe gleich umsetzen 

Es wird nur einen Android-Client geben. Mit iOS kenne ich mich gar nicht aus und habe auch nicht die Lust mich da einzuarbeiten.. Von daher wäre KyroNet eine gute Lösung.


----------

