Ich stehe vor einem folgenden Dilemma:
Entwerfen Sie ein neues Netzwerkprotokoll, das zwischen einem Server (Java-Software) und Desktop- und mobilen Clients verwendet wird. Zu den mobilen Clients gehören J2ME, Android und vielleicht in Zukunft sogar das iPhone.
Der Datenstrom ist ein Echtzeit-Konstantstrom mit auch selteneren Teilen. Die Clients zeigen Wellenformen dieser Daten und auch Daten, die nicht sofort aktualisiert werden müssen. Die Clients sollten ebenfalls authentifiziert sein.
Ich möchte es vermeiden, wenn möglich eine vollständig benutzerdefinierte TCP-Protokollimplementierung von Grund auf zu erstellen.
Heutzutage empfehlen die Leute normalerweise, alles im REST-Stil zu machen, was ich auch wirklich mag. In diesem Fall bin ich jedoch ein wenig zögerlich: Wie würden Sie einen konstanten Datenstrom zusätzlich zu REST implementieren? Eine chunked HTTP-Antwort?
Ich denke auch über Nicht-Klartext-Protokolle nach (die aktuellen, die ich ersetze, sind binäre Protokolle). Diese aktuellen Protokolle haben ihre ernsthaften Probleme, so dass sie wirklich ersetzt werden sollten.
Google-Protokollpuffer sehen nach einem ziemlich starken Kandidaten für die Verarbeitung der Low-Level-Details aus, aber ich bin mir nicht sicher, ob es von Android aus verwendet werden kann. Und ich bin mir ziemlich sicher, dass die iPhone-Implementierung auch Probleme damit haben würde.
Es gibt auch BEEP , aber ich denke, es ist ziemlich tot und ich frage mich, ob es jemals weit verbreitet war.
Irgendwelche Ideen?
Ich denke, bevor Sie in das Protokolldesign einsteigen, sollten Sie die folgenden Punkte wirklich sorgfältig beachten:
Sie können sich Kryo und / oder KryoNet , die NIO und Java-basiert sind und den Desktop und Android arbeiten. Sie müssten jedoch die iPhone-Seite schreiben, was ziemlich schwierig wäre. Kryo schlägt die Protokollpuffer von Google in serialisierter Größe ( Benchmarks hier ) und die Benutzerfreundlichkeit (Nr .proto-Typ-Schema muss geschrieben werden, mit Kryo sind die Java-Klassendefinitionen das Schema).
In Bezug auf NIO können Sie sich NPTL ansehen. Das Alte wird wieder neu.
Sie können sich das RTP (Echtzeit-Transportprotokoll) ansehen, das möglicherweise nicht direkt nützlich ist (und / oder könnte übertrieben sein), aber sein Design würde Ihnen einige gute Ideen geben, um davon zu arbeiten. Und Sie könnten es vielleicht auch benutzen.
Es ist keine elegante Lösung, aber Sie können dies über "Straight http" tun, indem Sie das Feld "content-length" in der HTTP-Antwort nicht festlegen und den Ausgabestream nie schließen. Sende einfach weiter Daten.
Sie können auch eine sehr große Inhaltslänge festlegen und Daten vom Server in Echtzeit zurücksenden, bis der Server diesen Betrag gesendet hat. Dann kann der Client eine neue Anfrage erstellen oder nicht.
Leider konnte ich keine nützlichen Links für diese Ideen finden, aber ich vertraue darauf, dass Sie die Ideen bekommen.
Das eigentliche Plus dieser Ideen ist, dass sie über HTTP sind, was durch das Firewall-Problem kommt, und Sie können Ihre App als Webanwendung mit einem Servlet implementieren.
Nur meine 2 Cent;)
Tags und Links java tcp network-protocols