Programowanie gniazd w Javie: krótki przewodnik

Opublikowany: 2022-05-21

W Javie programowanie za pomocą gniazd to sposób na komunikację między programami i utrzymywanie połączenia z różnymi środowiskami JRE — zarówno serwerami zorientowanymi na połączenie, jak i serwerami niezorientowanymi na połączenie. Gniazdo serwera Java służy wyłącznie do inicjowania i przetwarzania komunikacji między serwerem a klientem.

Ten blog zawiera wszystko, co trzeba wiedzieć o programowaniu gniazd.

Spis treści

Programowanie gniazd w Javie

Programowanie gniazd to proces uzupełniania i wykorzystywania oddzielnych węzłów sieci w sposób interaktywny. Jest to system komunikacji dwukierunkowej, w którym jedno gniazdo (węzeł) nasłuchuje na określonym porcie pod adresem IP, podczas gdy drugie gniazdo się łączy.

Gniazda w Javie

W Javie gniazda stanowią jeden koniec dwukierunkowego kanału komunikacyjnego, który łączy dwa programy sieciowe. Warstwa TCP służy do przypisania numeru portu do danego gniazda Java w celu identyfikacji aplikacji, do której przesyłamy dane. Używamy kombinacji adresu IP i numeru portu, aby utworzyć punkt końcowy.

Platforma Java zawiera klasę o nazwie Socket, która implementuje jedną stronę dwukierunkowego połączenia sieciowego między aplikacją Java a innym programem. Klasa znajduje się na szczycie implementacji niezależnej od platformy, chroniąc program Java przed szczegółami specyficznymi dla systemu.

Używając klasy zamiast określonego kodu natywnego, programy Java mogą komunikować się przez sieć w sposób niezależny od platformy.

Ponadto java.net zawiera klasę ServerSocket, która implementuje gniazdo, którego serwery mogą używać do nasłuchiwania i akceptowania połączeń od klientów. To jest przykład pokazujący, jak używać klas ServerSocket i Socket.

Między portem po stronie klienta a portem po stronie serwera tworzone jest połączenie.

Nawiązywanie połączenia z gniazdem Java [STRONA KLIENTA]

Przed kontynuowaniem programowania po stronie klienta klient powinien poczekać na inicjację serwera. Po uruchomieniu zacznie wysyłać zapytania do serwera Java. Klient będzie wtedy czekał na odpowiedź serwera. To jest dobre podsumowanie logiki połączenia klient-serwer.

Przyjrzyjmy się programowaniu po stronie klienta bardziej szczegółowo.

Aby połączyć się z inną maszyną, potrzebujesz połączenia z gniazdem. Oba komputery muszą wiedzieć, gdzie znajdują się w sieci (adres IP) i jakiego portu TCP używają do nawiązania połączenia z gniazdem. Framework java.net oznacza klasę gniazda.

Adres IP serwera jest pierwszym argumentem wejściowym. Następnym parametrem jest port TCP. (To nic innego jak liczba, która mówi, który program powinien zostać uruchomiony na serwerze.) Na przykład HTTP używa portu 80. Zwykle zakres numerów portów wynosi od 0 do 65535.

Komunikacja

Strumienie są wykorzystywane do wprowadzania i wyprowadzania danych podczas komunikacji przez gniazdo. Po wysłaniu żądań i ustanowieniu silnego połączenia należy wyłączyć połączenie z gniazdem.

Zamykanie połączenia przez gniazdo serwera Java

Połączenie z gniazdem jest jawnie zamykane po wysłaniu komunikatu do serwera, połączenie z gniazdem jest jawnie zamykane.

// Demo programu Java dla Clientele

importować java.net.*;

importować java.io.*;

klasa publiczna Client_Side_Program

{

// do inicjalizacji strumieni gniazd, strumieni wejściowych i strumieni wyjściowych

prywatne gniazdo Socket = null;

prywatne wejście DataInputStream = null;

prywatne DataOutputStream out = null;

// konstruktor do umieszczenia portu TCP i adresu IP

klient publiczny (dodawanie ciągu, port wewnętrzny)

{

// nawiąż połączenie

próbować

{

gniazdo = nowe Gniazdo(dodaj, port);

System.out.println("Połączony");

// pobiera dane wejściowe z terminala

input = nowy DataInputStream(System.in);

// wysyła wyjście do gniazda

out = new DataOutputStream(socket.getOutputStream());

}

catch(UnknownHostException u)

{

System.out.println(u);

}

catch(IOException i)

{

System.out.println(i);

}

// ciąg do odczytania wiadomości z wejścia

Linia ciągu = „”;

// czytaj dalej, aż zostanie wprowadzone „Over”

while (!line.equals("Powyżej"))

{

próbować

{

linia = input.readLine();

out.writeUTF(linia);

}

catch(IOException i)

{

System.out.println(i);

}

}

// zamknij połączenie

próbować

{

wejście.zamknij();

out.zamknij();

gniazdo.zamknij();

}

catch(IOException i)

{

System.out.println(i);

}

}

public static void main(String args[])

{

Klient Klient = nowy Klient(„127.0.0.1”, 5000);

}

}

Aby odwiedzić źródło tego kodu, kliknij tutaj .

Nawiązywanie połączenia z gniazdem Java [STRONA SERWERA]

Serwer tworzy swój obiekt i oczekuje na żądanie klienta, rozważając połączenie po stronie gniazda serwera Java. Serwer będzie wchodzić w interakcję z klientem po wysłaniu żądania. Będziesz potrzebować dwóch gniazd, aby zakodować aplikację po stronie serwera, co wygląda następująco — gdy klient tworzy nowe Socket(), tworzony jest ServerSocket, który czeka na żądania klienta. Proste gniazdo można zdefiniować jako program, który inicjuje komunikację z klientem po stronie serwera. Możesz odpowiednio przekazać odpowiedzi klientowi, gdy otrzymasz raport z połączenia gniazda po stronie serwera java.

Komunikacja

Aby użyć gniazda do wysyłania danych wyjściowych, zazwyczaj nie możemy się doczekać użycia metody getOutputStream().

Zamykanie połączenia przez gniazdo serwera Java

Bardzo ważne jest, aby zakończyć połączenie poprzez wyłączenie zarówno gniazda, jak i strumieni wejścia-wyjścia.

// Program Java serwera

importować java.net.*;

importować java.io.*;

Serwer klasy publicznej

{

//zainicjuj gniazdo i strumień wejściowy

prywatne gniazdo Socket = null;

prywatny serwer ServerSocket = null;

private DataInputStream in = null;

// konstruktor z portem

Serwer publiczny (port wewnętrzny)

{

// czeka na połączenie po uruchomieniu serwera

próbować

{

serwer = nowy ServerSocket(port);

System.out.println("Serwer: uruchomiony");

System.out.println("Oczekiwanie na przybycie klienta...");

gniazdo = serwer.akceptuj();

System.out.println("Klient został zaakceptowany");

// do pobierania danych wejściowych gniazda klienta

in = nowy DataInputStream(

nowy BufferedInputStream(socket.getInputStream()));

Linia ciągu = „”;

// do odczytania wiadomości od klienta do momentu wysłania „Over”

while (!line.equals("Powyżej"))

{

próbować

{

linia = w.odczytUTF();

System.out.println(linia);

}

catch(IOException i)

{

System.out.println(i);

}

}

System.out.println("Zamykanie połączenia");

// zamknij połączenie

gniazdo.zamknij();

ogrodzić();

}

catch(IOException i)

{

System.out.println(i);

}

}

public static void main(String args[])

{

Serwer serwer = nowy serwer(5000);

}

}

Aby sprawdzić szczegóły tego kodu, kliknij tutaj .

Oprogramowanie po stronie serwera można uruchomić najpierw po skonfigurowaniu zarówno klienta, jak i serwera. Następnie musisz uruchomić oprogramowanie po stronie klienta i wysłać żądanie. Serwer zareaguje natychmiast, gdy żądanie nadejdzie ze strony klienta.

Poznaj nasze popularne kursy inżynierii oprogramowania

SL. Nie Programy rozwoju oprogramowania
1 Master of Science in Computer Science z LJMU i IIITB Program certyfikacji cyberbezpieczeństwa Caltech CTME
2 Pełny Bootcamp rozwoju stosu Program PG w Blockchain
3 Executive Post Graduate Programme in Software Development - specjalizacja w DevOps Wyświetl wszystkie kursy inżynierii oprogramowania

Uruchamianie terminala lub wiersza polecenia

Aby zainicjować terminal lub wiersz polecenia, skorzystamy z następujących poleceń. Na początek stworzymy dwa okna, jedno dedykowane dla serwera, a drugie dla klienta.

  1. Uruchom program serwera.

$ Serwer java

  1. Następnie w innym terminalu uruchom aplikację Klient jako,

klient java $

Oprogramowanie pokaże „Połączono” i „Zaakceptowano klienta”, gdy serwer zaakceptuje klienta.

  1. W polu Klient możesz rozpocząć wprowadzanie wiadomości. Oto przykład danych wejściowych Klienta.

Cześć! To moje pierwsze profesjonalne połączenie z gniazdem.

Które serwer otrzymuje i wyświetla w tym samym czasie

Cześć! To moje pierwsze profesjonalne połączenie z gniazdem.

Koniec.

Zamykanie połączenia

Jak wspomniano wcześniej, wysłanie „Powyżej” kończy połączenie między Klientem a Serwerem.

Przeczytaj nasze popularne artykuły związane z tworzeniem oprogramowania

Jak zaimplementować abstrakcję danych w Javie? Co to jest klasa wewnętrzna w Javie? Identyfikatory Java: definicja, składnia i przykłady
Zrozumienie enkapsulacji w OOPS z przykładami Wyjaśnienie argumentów wiersza poleceń w języku C 10 najważniejszych funkcji i cech chmury obliczeniowej w 2022 r.
Polimorfizm w Javie: pojęcia, typy, charakterystyka i przykłady Pakiety w Javie i jak ich używać? Git Tutorial dla początkujących: Naucz się Gita od podstaw

Wniosek

Programowanie Java Socket jest podstawowym narzędziem, które wykorzystuje interfejsy API gniazd do nawiązywania komunikacji między lokalnymi i zdalnymi aplikacjami klient-serwer. Właściwa znajomość programowania gniazd może usprawnić połączenia między serwerami i klientami.

Jeśli chcesz nauczyć się języka Java i opanować programowanie full-stack, mamy dla Ciebie bardzo efektowny kurs: Executive PG Program w tworzeniu oprogramowania – specjalizacja w tworzeniu pełnego stosu .

13-miesięczny program z IIIT-B ma na celu pomóc uczniom zdobyć umiejętności, takie jak podstawy informatyki, procesy tworzenia oprogramowania, interfejsy API zaplecza i interaktywny interfejs sieciowy. Otrzymasz dostęp do kursu Software Career Transition Bootcamp zarówno dla nie-technicznych, jak i nowych programistów, aby doskonalić swoje umiejętności programowania i wsparcie kariery 360° od upGrad.

Ucz się kursów rozwoju oprogramowania online z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.

Jakie są korzyści z nauki programowania gniazd w języku Java?

Gniazda mogą być używane do konstruowania aplikacji klient-serwer, takich jak czat, z punktu widzenia sieci. Gniazda są implementowane na najbardziej podstawowym poziomie bezpieczeństwa, aby wykryć, czy porty systemu są otwarte, czy istnieją standardowe programy do skanowania portów, takie jak Nmap, i czy można je wykorzystać na niskim poziomie. Można ich używać w taki sam sposób, jak polecenie SSH - Secure Socket Shell może służyć do łączenia się z serwerem zewnętrznym za pośrednictwem odwróconej powłoki.

Co robi funkcja akceptacji?

Funkcja accept czeka, aż klient połączy się z serwerem, blokując pozostawanie tam do momentu nadejścia argumentu. Następnie używamy funkcji getInputStream, aby pobrać dane wejściowe z gniazda. Serwer został zaprojektowany w taki sposób, aby nadal akceptował wysłane wiadomości, dopóki nie zostanie odebrane polecenie Over.

Dlaczego wątki są używane w programowaniu sieci?

Chcemy, aby kilku klientów dołączyło jednocześnie. Musimy więc zastosować wątki po stronie serwera, aby inny wątek mógł obsłużyć każde żądanie klienta. Załóżmy, że do serwera przychodzą dwa żądania jednocześnie. Ponieważ w naszej prostej aplikacji serwer-klient nie podano żadnej metody przetwarzania wielu żądań jednocześnie, żądanie, które nadejdzie nawet nanosekundę wcześniej, będzie mogło połączyć się z serwerem, podczas gdy drugie żądanie zostanie odrzucone.