logo

Programowanie gniazd w Javie

Programowanie w języku Java Socket służy do komunikacji pomiędzy aplikacjami działającymi w różnych środowiskach JRE.

Programowanie za pomocą gniazd Java może być zorientowane na połączenie lub bez połączenia.

Klasy Socket i ServerSocket służą do programowania gniazd zorientowanych na połączenie, a klasy DatagramSocket i DatagramPacket służą do programowania gniazd bez połączenia.

Klient w programowaniu gniazd musi znać dwie informacje:

  1. Adres IP serwera i
  2. Numer portu.

Tutaj dokonamy jednokierunkowej komunikacji klient-serwer. W tej aplikacji klient wysyła wiadomość do serwera, serwer odczytuje wiadomość i drukuje ją. Tutaj używane są dwie klasy: Socket i ServerSocket. Klasa Socket służy do komunikacji klienta i serwera. Dzięki tej klasie możemy czytać i pisać wiadomości. Klasa ServerSocket jest używana po stronie serwera. Metoda Accept() klasy ServerSocket blokuje konsolę do czasu połączenia klienta. Po pomyślnym połączeniu klienta zwraca instancję Socket po stronie serwera.

Programowanie gniazd w Javie

Klasa gniazda

Gniazdo to po prostu punkt końcowy komunikacji między maszynami. Do utworzenia gniazda można użyć klasy Socket.

Ważne metody

metodaOpis
1) publiczny strumień wejściowy getInputStream()zwraca strumień wejściowy podłączony do tego gniazda.
2) publiczny strumień wyjściowy getOutputStream()zwraca strumień wyjściowy dołączony do tego gniazda.
3) publiczne zsynchronizowane zamknięcie pustej przestrzeni()zamyka to gniazdo

Klasa ServerSocket

Do utworzenia gniazda serwera można użyć klasy ServerSocket. Obiekt ten służy do nawiązywania komunikacji z klientami.

Ważne metody

metodaOpis
1) gniazdo publiczne akceptuje()zwraca gniazdo i ustanawia połączenie między serwerem a klientem.
2) publiczne zsynchronizowane zamknięcie pustej przestrzeni ()zamyka gniazdo serwera.

Przykład programowania w języku Java

Tworzenie serwera:

Aby stworzyć aplikację serwerową musimy stworzyć instancję klasy ServerSocket. Tutaj używamy numeru portu 6666 do komunikacji między klientem a serwerem. Możesz także wybrać dowolny inny numer portu. Metoda Accept() czeka na klienta. Jeśli klient łączy się przy użyciu podanego numeru portu, zwraca instancję Socket.

 ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection and waits for the client 

Tworzenie klienta:

Aby stworzyć aplikację kliencką musimy stworzyć instancję klasy Socket. Tutaj musimy przekazać adres IP lub nazwę hosta Serwera i numer portu. Tutaj używamy „localhost”, ponieważ nasz serwer działa w tym samym systemie.

 Socket s=new Socket('localhost',6666); 

Przyjrzyjmy się prostemu programowaniu gniazd Java, w którym klient wysyła tekst, a serwer go odbiera i drukuje.

Plik: MójSerwer.java

 import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args){ try{ ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection DataInputStream dis=new DataInputStream(s.getInputStream()); String str=(String)dis.readUTF(); System.out.println('message= '+str); ss.close(); }catch(Exception e){System.out.println(e);} } } 

Plik: MójKlient.java

 import java.io.*; import java.net.*; public class MyClient { public static void main(String[] args) { try{ Socket s=new Socket('localhost',6666); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF('Hello Server'); dout.flush(); dout.close(); s.close(); }catch(Exception e){System.out.println(e);} } } 
pobierz ten przykład

Aby uruchomić ten program, otwórz dwa wiersze poleceń i wykonaj każdy program w każdym wierszu poleceń, jak pokazano na poniższym rysunku.

Po uruchomieniu aplikacji klienckiej na konsoli serwera wyświetli się komunikat.

Programowanie sieciowe w Javie

Przykład programowania w Java Socket (odczyt i zapis po obu stronach)

W tym przykładzie klient najpierw napisze do serwera, a następnie serwer otrzyma i wydrukuje tekst. Następnie serwer napisze do klienta, a klient otrzyma i wydrukuje tekst. Krok trwa.

Plik: MójSerwer.java

 import java.net.*; import java.io.*; class MyServer{ public static void main(String args[])throws Exception{ ServerSocket ss=new ServerSocket(3333); Socket s=ss.accept(); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=din.readUTF(); System.out.println('client says: '+str); str2=br.readLine(); dout.writeUTF(str2); dout.flush(); } din.close(); s.close(); ss.close(); }} 

Plik: MójKlient.java

 import java.net.*; import java.io.*; class MyClient{ public static void main(String args[])throws Exception{ Socket s=new Socket('localhost',3333); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=br.readLine(); dout.writeUTF(str); dout.flush(); str2=din.readUTF(); System.out.println('Server says: '+str2); } dout.close(); s.close(); }}