logo

Programování Java Socket

Programování Java Socket se používá pro komunikaci mezi aplikacemi běžícími na různých JRE.

Programování Java Socket může být orientované na připojení nebo bez připojení.

Třídy Socket a ServerSocket se používají pro programování soketů orientovaných na připojení a třídy DatagramSocket a DatagramPacket se používají pro programování soketů bez připojení.

Klient v programování soketu musí znát dvě informace:

  1. IP adresa serveru a
  2. Číslo portu.

Zde provedeme jednosměrnou komunikaci klienta a serveru. V této aplikaci klient odešle zprávu na server, server zprávu přečte a vytiskne. Zde se používají dvě třídy: Socket a ServerSocket. Třída Socket se používá ke komunikaci klienta a serveru. Prostřednictvím této třídy můžeme číst a psát zprávy. Třída ServerSocket se používá na straně serveru. Metoda accept() třídy ServerSocket blokuje konzolu, dokud se klient nepřipojí. Po úspěšném připojení klienta vrátí instanci Socketu na straně serveru.

Soketové programování v Javě

Třída zásuvky

Soket je jednoduše koncový bod pro komunikaci mezi počítači. Třídu Socket lze použít k vytvoření soketu.

Důležité metody

MetodaPopis
1) veřejný InputStream getInputStream()vrátí InputStream připojený k tomuto soketu.
2) veřejný OutputStream getOutputStream()vrátí OutputStream připojený k tomuto soketu.
3) veřejné synchronizované void close()zavře tuto zásuvku

Třída ServerSocket

Třídu ServerSocket lze použít k vytvoření serverového soketu. Tento objekt slouží k navázání komunikace s klienty.

Důležité metody

MetodaPopis
1) veřejná zásuvka accept()vrátí soket a vytvoří spojení mezi serverem a klientem.
2) veřejné synchronizované void close()zavře serverový soket.

Příklad programování Java Socket

Vytváření serveru:

K vytvoření serverové aplikace potřebujeme vytvořit instanci třídy ServerSocket. Zde používáme číslo portu 6666 pro komunikaci mezi klientem a serverem. Můžete také zvolit jakékoli jiné číslo portu. Metoda accept() čeká na klienta. Pokud se klienti připojí s daným číslem portu, vrátí instanci Socket.

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

Vytváření klienta:

K vytvoření klientské aplikace potřebujeme vytvořit instanci třídy Socket. Zde musíme předat IP adresu nebo název hostitele serveru a číslo portu. Zde používáme 'localhost', protože náš server běží na stejném systému.

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

Podívejme se na jednoduché programování Java socketů, kdy klient odešle text a server jej přijme a vytiskne.

Soubor: MyServer.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);} } } 

Soubor: MyClient.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);} } } 
stáhněte si tento příklad

Chcete-li spustit tento program, otevřete dva příkazové řádky a spusťte každý program na každém příkazovém řádku, jak je znázorněno na obrázku níže.

Po spuštění klientské aplikace se na konzole serveru zobrazí zpráva.

Síťové programování Java

Příklad programování Java Socket (čtení a zápis na obou stranách)

V tomto příkladu klient nejprve zapíše na server, poté server přijme a vytiskne text. Poté server zapíše klientovi a klient přijme a vytiskne text. Krok pokračuje.

Soubor: MyServer.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(); }} 

Soubor: MyClient.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(); }}