2016-02-16 2 views
5

Ich muss mit einem Server über TCP/IP mit einem grundlegenden Nachricht/Antwort-Protokoll interagieren (so für jede Anfrage werde ich eine definierte Antwort erhalten).Java Socket immer noch erste Wahl für die TCP/IP-Programmierung in Java?

Im JVM-Ökosystem glaube ich, dass Java Socket das Tool war, das ich vor 15 Jahren benutzt habe, aber ich frage mich, ob es heutzutage etwas geeigneteres im JDK gibt? Zum Beispiel muss man bei Java Sockets eine Anforderung manuell abbrechen, wenn keine Antwort empfangen wird, was sich sehr altmodisch anfühlt.

Gibt es im JDK- oder JVM-Universum etwas Neues?

+1

Wenn Ihre Anforderungen grundlegend sind, gibt es keinen Grund, über Socket hinauszugehen. – EJP

+0

Sie sollten sich die nicht blockierende Socket-Behandlung in NIO ansehen. –

+0

Oder Sie könnten von einem "Basic Message/Response Protocol" wegkommen. – Stefan

Antwort

4

Nein, es heutzutage viel bessere Möglichkeit gibt, die können Sie Ihre Client/Server asynchron ohne zusätzliche Threading implementieren.

Betrachten Sie SocketChannel von Nio oder noch besser AsynchronousSocketChannel von Nio2. Sehen Sie sich diese tutorial

Gerade die letztere Option wird Ihnen erlauben, nur der Listener zu starten und Rückruf registrieren, die aufgerufen wird, sobald neue Verbindung angefordert wird, Daten angekommen, wurden die Daten geschrieben usw.

Sehen Sie sich auch auf einige suchen High-Level-Lösungen wie Netty. Es wird sich um den Netzwerkkern kümmern und die Last gleichmäßig auf die Executoren verteilen. Zusätzlich bietet es eine klare Trennung von Netzwerkschicht und Verarbeitungsschicht. Für die Verarbeitungsebene bietet es Ihnen viele wiederverwendbare Codecs für gängige Protokolle.

+0

NIO ist für niedrige Ebene vorzuziehen, aber NIO2 ist nur dann wirklich nützlich, wenn Sie IMHO infiniband haben. –

2

Sie können versuchen, RMI, die auf TCP/IP funktioniert, sondern versteckt die ganze Arbeit mit einem praktischen Satz von APIs.

diesem Tutorial folgen post

+0

Wer sagt, dass ich Methoden auf einem Remote-Server anrufe? Ich sende nur Nachrichten und empfange einige Zeichenfolgen zurück :-) – Sebi

1

Nun, es gibt wirklich eine Menge anderer Technologien zu verwenden, zum Beispiel hat JMS verschiedene Implementierungen, die out of the Box funktionieren.

Sockets sind Low-Level-Bausteine ​​der Netzwerkkommunikation, wie Drähte im Stromnetz Ihres Hauses. Ja, sie sind altmodisch, ja, wir wollen sie wahrscheinlich nicht sehen, aber sie sind dort und werden aus gutem Grund dort bleiben.

Auf Sockets können Sie z. Wählen Sie die HTTPUrlConnection, die den Großteil des HTTP-Protokolls implementiert. Trotzdem liegt es in Ihren Händen, Timeout-Richtlinien festzulegen, was ich sehr nützlich und extrem schmerzhaft finde.

http://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/

Sie sind frei, über eine Abstraktionsebene zu bewegen, und verwenden Sie eine fertige REST-Bibliothek wie folgt aus: http://unirest.io/java.html

Das Beispiel verbindet oben auf einen Server, konfiguriert einen HTTP-Abfrage-String durchführen, die Anforderung (Timeout, Kodierungen, die alle das Chaos unter der Haube) und schließlich die Antwort im JSON-Format in ein paar Zeilen erhalten:

Unirest.post("http://httpbin.org/post") 
    .queryString("name", "Mark") 
    .field("last", "Polo") 
    .asJson(); 

Heute REST verfügbar eine große Menge an Web-Service verwenden Protokoll, das eine einfache Befehlsantwort über HTTP ist. Wenn Sie eine Chance haben, schlage ich vor, REST zu verwenden, da Sie leicht verfügbare Implementierungen auf Client- und Serverseite finden können, und Sie müssen das Rad auf der Befehlsprotokollschicht auch nicht neu erfinden.

Auf der Clientseite ist Unireest sehr praktisch.Auf der Serverseite hatten wir wirklich großartige Erfahrung in der 1.2.xx Serie von Play! Rahmen. Aber es gibt Tausende von diesen Dingen da draußen, suchen Sie einfach nach "REST".

+0

Entschuldigung, aber nicht anwendbar, da das Protokoll, das ich verwenden muss, auf TCP/IP-Ebene ist und nicht auf HTTP oder sogar auf REST. – Sebi

+0

Wenn Sie Dinge auf TCP/IP-Ebene kontrollieren müssen, was ist falsch an der Verwendung von Sockets und nio? :) –

1

Werfen Sie einen Blick auf Netty Project "Netty ist ein NIO Client-Server-Framework, das die schnelle und einfache Entwicklung von Netzwerk-Anwendungen wie Protokoll-Server und Clients ermöglicht. Es vereinfacht und rationalisiert die Netzwerkprogrammierung wie TCP und UDP Socket-Server . "

Dieses Framework gibt uns viele Funktionen, die den Programmierprozess vereinfachen und eine große Skalierbarkeit ermöglichen.

Wird von Twitter und vielen großen Unternehmen der Technologiebranche verwendet.

Dies ist ein nice presentation von Norman Maurer.