2016-02-16 36 views
5

Potrzebuję interakcji z serwerem za pośrednictwem protokołu TCP/IP z podstawowym protokołem komunikatów/odpowiedzi (więc dla każdego żądania otrzymam zdefiniowaną odpowiedź).Java Socket wciąż jest pierwszym wyborem do programowania TCP/IP w Javie?

W ekosystemie JVM, myślę, że Java Socket było narzędziem, które można używać 15 lat temu, ale zastanawiam się, czy obecnie w JDK jest coś bardziej odpowiedniego? Na przykład, z Java Sockets wciąż trzeba ręcznie przeterminować żądanie, jeśli nie otrzymano żadnej odpowiedzi, co wydaje się bardzo staromodne.

Czy jest coś nowego w świecie JDK lub JVM?

+1

Jeśli twoje wymagania są podstawowe, nie ma powodu, aby patrzeć poza "Gniazdo". – EJP

+0

Może zajrzeć do niezablokowania obsługi gniazd w NIO. –

+0

Albo możesz uciec od "podstawowego protokołu wiadomości/odpowiedzi". – Stefan

Odpowiedz

4

Nie istnieją obecnie znacznie lepszym rozwiązaniem, które pozwala realizować swoje klient/serwer asynchronicznie bez dodatkowego gwintu.

Spójrz na SocketChannel od nio lub jeszcze lepiej AsynchronousSocketChannel od nio2. Sprawdź ten tutorial

zwłaszcza drugą opcję będzie można po prostu zacząć słuchacza połączenia i zarejestrować wywołania zwrotnego, która będzie wywoływana, gdy nowe połączenie jest wymagane dane przyjechał, dane zostały napisane itp

również pod uwagę patrząc na niektóre rozwiązania wysokiego poziomu, takie jak Netty. Zadba o rdzeń sieci, rozłoży obciążenie równomiernie na executorów. Dodatkowo zapewnia czyszczenie separacji warstwy sieci i warstwy przetwarzania. Dla warstwy przetwarzania dostarczy Ci wiele kodeków wielokrotnego użytku dla popularnych protokołów.

+0

NIO jest preferowane dla niskiego poziomu, ale NIO2 jest bardzo przydatny tylko wtedy, gdy masz infiniband IMHO. –

2

Możesz wypróbować RMI, który działa na TCP/IP, ale ukrywa cały hardwork za pomocą wygodnego zestawu API.

Śledź ten tutorial post

+0

Kto powiedział, że wywołuję metody na zdalnym serwerze? Po prostu wysyłam wiadomości i odbieram kilka ciągów wstecz :-) – Sebi

1

Cóż, istnieje naprawdę wiele innych technologii do wykorzystania, na przykład JMS ma różne implementacje, które działają po wyjęciu z pudełka.

Gniazda są niskopoziomowymi elementami składowymi sieci komunikacyjnej, takimi jak przewody w sieci elektrycznej domu. Tak, są staroświeckie, tak, prawdopodobnie nie chcemy ich widzieć, ale są tam i pozostaną tam z ważnego powodu.

Na górze gniazdek można np. wybierz HTTPUrlConnection, który implementuje większość protokołu HTTP. Mimo to, ustalanie zasad dotyczących limitu czasu jest w twoich rękach, co uważam za całkiem użyteczne i jednocześnie bolesne w tym samym czasie.

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

Jesteś wolny, aby przejść o jeden poziom abstrakcji wyżej i wykorzystać gotową bibliotekę odpoczynek, taki jak ten: http://unirest.io/java.html

Powyższy przykład łączy się z serwerem, konfiguruje ciąg zapytania HTTP wykonać żądanie (limit czasu, kodowanie, cały bałagan pod maską), a ostatecznie uzyskać odpowiedź w formacie JSON w kilku zdaniach:

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

Obecnie ogromna ilość usług internetowych są dostępne za pomocą REST protokół, który jest prostą reakcją na polecenia przez HTTP. Jeśli masz szansę, sugeruję użycie REST, ponieważ możesz łatwo znaleźć dostępne implementacje po stronie klienta i serwera, a także nie musisz odkrywać koła na warstwie poleceń.

Po stronie klienta, unirest jest całkiem wygodny.Po stronie serwera mieliśmy naprawdę świetne doświadczenie w serii gier 1.2.xx! struktura. Ale są tysiące takich rzeczy, po prostu wyszukaj "REST".

+0

Niestety, ale nie dotyczy, ponieważ protokół, którego muszę używać, jest na poziomie TCP/IP, a nie HTTP lub nawet REST. – Sebi

+0

Jeśli potrzebujesz kontrolować rzeczy na poziomie TCP/IP, to co jest nie tak z korzystaniem z gniazd i nio? :) –

1

Spójrz na Netty Project "Netty jest NIO ram klient-serwer, który umożliwia szybkie i łatwe tworzenie aplikacji sieciowych, takich jak serwery protokołów i klientów. To znacznie upraszcza i usprawnia programowanie sieciowe, takie jak TCP i serwera gniazda UDP . "

Ta struktura daje nam wiele możliwości, które upraszczają proces programowania, umożliwiając dużą skalowalność.

Jest używany przez Twittera i wiele dużych firm z branży Tecnology.

To jest nice presentation od Normana Maurera.