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:
- IP adresa serveru a
- Čí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.
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
Metoda | Popis |
---|---|
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
Metoda | Popis |
---|---|
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.
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(); }}