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:
- Adres IP serwera i
- 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.
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
metoda | Opis |
---|---|
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
metoda | Opis |
---|---|
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.
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(); }}