Programiranje Java Socket se uporablja za komunikacijo med aplikacijami, ki se izvajajo na različnih JRE.
Programiranje Java Socket je lahko povezovalno ali brez povezav.
Razreda Socket in ServerSocket se uporabljata za programiranje vtičnic, usmerjenih v povezavo, razreda DatagramSocket in DatagramPacket pa se uporabljata za programiranje vtičnic brez povezave.
Odjemalec pri programiranju vtičnic mora poznati dve informaciji:
- IP naslov strežnika in
- Številka vrat.
Tu bomo vzpostavili enosmerno komunikacijo odjemalca in strežnika. V tej aplikaciji odjemalec pošlje sporočilo strežniku, strežnik sporočilo prebere in ga natisne. Tukaj se uporabljata dva razreda: Socket in ServerSocket. Razred Socket se uporablja za komunikacijo odjemalca in strežnika. S tem razredom lahko beremo in pišemo sporočila. Razred ServerSocket se uporablja na strani strežnika. Metoda accept() razreda ServerSocket blokira konzolo, dokler odjemalec ni povezan. Po uspešni povezavi odjemalca vrne primerek Socket na strani strežnika.
Razred vtičnice
Vtičnica je preprosto končna točka za komunikacijo med stroji. Razred Socket lahko uporabite za ustvarjanje vtičnice.
Pomembne metode
Metoda | Opis |
---|---|
1) javni InputStream getInputStream() | vrne InputStream, pritrjen s to vtičnico. |
2) javni OutputStream getOutputStream() | vrne OutputStream, pritrjen s to vtičnico. |
3) javno sinhronizirano void close() | zapre to vtičnico |
Razred ServerSocket
Razred ServerSocket lahko uporabite za ustvarjanje strežniške vtičnice. Ta objekt se uporablja za vzpostavitev komunikacije s strankami.
Pomembne metode
Metoda | Opis |
---|---|
1) sprejem javne vtičnice () | vrne vtičnico in vzpostavi povezavo med strežnikom in odjemalcem. |
2) javno sinhronizirano void close() | zapre strežniško vtičnico. |
Primer programiranja Java Socket
Ustvarjanje strežnika:
Za ustvarjanje strežniške aplikacije moramo ustvariti primerek razreda ServerSocket. Tukaj uporabljamo številko vrat 6666 za komunikacijo med odjemalcem in strežnikom. Izberete lahko tudi katero koli drugo številko vrat. Metoda accept() čaka na odjemalca. Če se odjemalci povežejo z dano številko vrat, vrnejo primerek Socket.
ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection and waits for the client
Ustvarjanje odjemalca:
Za ustvarjanje odjemalske aplikacije moramo ustvariti primerek razreda Socket. Tukaj moramo posredovati naslov IP ali ime gostitelja strežnika in številko vrat. Tukaj uporabljamo 'localhost', ker naš strežnik deluje na istem sistemu.
Socket s=new Socket('localhost',6666);
Oglejmo si preprosto programiranje vtičnic Java, kjer odjemalec pošlje besedilo, strežnik pa ga prejme in natisne.
Datoteka: 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);} } }
Datoteka: 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);} } }prenesite ta primer
Za izvedbo tega programa odprite dva ukazna poziva in zaženite vsak program v vsakem ukaznem pozivu, kot je prikazano na spodnji sliki.
Po zagonu odjemalske aplikacije bo na konzoli strežnika prikazano sporočilo.
Primer programiranja Java Socket (branje-pisanje obojestransko)
V tem primeru bo odjemalec najprej pisal strežniku, nato bo strežnik prejel in natisnil besedilo. Nato bo strežnik pisal odjemalcu, odjemalec pa bo prejel in natisnil besedilo. Korak gre naprej.
Datoteka: 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(); }}
Datoteka: 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(); }}