Socket cho Client
Khái ni m Socket
D li u đ c truy n trên m ng Internet d i d ng các gói (packet) có kích th c h u h n
đ c g i là datagram. M i datagram ch a m t header và m t payload. Header ch a đa ch và c ng c n truy n gói tin đ n, c ng nh đa ch và c ng xu t phát c a gói tin, và các thông tin khác đ c s d ng đ đ m b o đ tin c y truy n tin. payload ch a d li u. Tuy nhiên do các datagram có chi u dài h u h n nên th ng ph i phân chia d li u thành nhi u gói và khôi ph c l i d li u ban đ u t các gói n i nh n. Trong quá trình truy n tin có th có th có m t hay nhi u gói b m t hay b h ng và c n ph i truy n l i, ho c các gói tin đ n không theo đúng trình t . tránh nh ng đi u này - vi c phân chia d li u thành các gói, t o các header, phân tích header c a các gói đ n, qu n lý danh sách các gói đã nh n đ c và các gói ch a nh n đ c, ... r t nhi u công vi c c n ph i th c hi n, và đòi h i r t nhi u ph n m m tinh vi.
Th t may m n, b n không c n ph i t th c hi n công vi c này. Socket là m t cu c cách m ng c a Berkeley UNIX. Chúng cho phép ng i l p trình xem m t liên k t m ng nh là m t lu ng mà có th đ c d li u ra hay ghi d li u vào t lu ng này.
V m t l ch s Socket là m t s m r ng c a m t trong nh ng ý t ng quan tr ng nh t c a UNIX: t t c các thao tác vào/ra gi ng nh vào ra file đ i v i ng i l p trình, cho dù b n đang làm vi c v i bàn phím, màn hình đ h a, m t file thông th ng, hay m t liên k t m ng. Các Socket che d u ng i l p trình kh i các chi ti t m c th p c a m ng nh môi ki u đ ng truy n, các kích th c gói, yêu c u truy n l i gói, các đa ch m ng...
- 50 - M t socket có th th c hi n b y thao tác c b n: 1. K t n i v i m t máy xa (ví d , chu n b đ g i và nh n d li u) 2. G i d li u 3. Nh n d li u 4. Ng t liên kêt 5. Gán c ng 6. Nghe d li u đ n
7. Ch p nh n liên k t t các máy xa trên c ng đã đ c gán
L p Socket c a Java đ c s d ng b i c client và server, có các ph ng th c t ng ng v i b n thao tác đ u tiên. Ba thao tác cu i ch c n cho server đ ch các client liên k t v i chúng. Ba thao tác cu i đ c cài đ t b i l p ServerSocket. Các socket cho client th ng đ c s d ng theo mô hình sau:
1. M t socket m i đ c t o ra b ng cách s d ng hàm d ng Socket(). 2. Socket c g ng liên k t v i m t host xa.
3. M i khi liên k t đ c thi t l p, các host xa nh n các lu ng vào và lu ng ra t socket, và s d ng các lu ng này đ g i d li u cho nhau. Ki u liên k t này đ c g i là song công (full-duplex), các host có th nh n và g i d li u đ ng th i. Ý ngh a c a d li u ph thu c vào giao th c; b n g i các l nh khác nhau t i m t FTP server h n là m t HTTP server. 4. Khi vi c truy n d li u hoàn thành, m t ho c c hai phía ng t liên k t. M t s giao th c,
nh HTTP, đòi h i m i liên k t ph i b đóng sau m i khi yêu c u đ c ph c v . Các giao th c khác, ch ng h n FTP, cho phép nhi u yêu c u đ c x lý trong m t liên k t đ n.
L p Socket
Các hàm d ng
public Socket(String host, int port) throws UnknownHostException, IOException
Hàm d ng này t o m t TCP socket trên v i host và c ng xác đnh, và c g ng th c hi n liên k t v i host xa. Ví d :
try{
Socket s = new Socket( “www.ora.com”,80);
} catch(UnknownHostException e){ System.err.println(e); } catch(IOException e){ System.err.println(e); }
Trong hàm d ng này tham s host là hostname ki u String, n u host không xác đnh ho c máy ch tên mi n không ho t đ ng thì constructor đ a ra ngo i l UnknownHostException. Vì m t lý do nào đó mà không th m đ c socket thì constructor s đ a ra ngo i l IOException. Có nhi u nguyên nhân khi n cho m t liên k t th t b i: host mà ta đang c g ng k t n i t i không ch p nh n liên k t, k t n i Internet có th b ng t, ho c v n đ đnh tuy n có th ng n ng a các gói tin c a b n t i đích.
Ví d : Vi t ch ng trình đ ki m tra trên 1024 c ng đ u tiên nh ng c ng nào đang có server ho t
đ ng
- 51 -
Khái ni m ServerSocket
Trong ch ng tr c chúng ta đã th o lu n các socket theo quan đi m c a các client. Tuy nhiên b n thân các socket cho client không có ích nhi u l m tr khi chúng có kh n ng giao ti p v i server. Các socket mà chúng ta th o lu n trong ch ng tr c không đ đ vi t các server. t o m t Socket b n c n ph i bi t host trên Internet mà b n c n k t n i t i. Khi b n đang vi t m t server b n s không bi t ai là ng i liên l c v i b n; ngay c khi b n bi t đi u đó thì b n c ng không th bi t
đ c host mu n liên l c v i b n. M t khác, m t server gi ng nh m t ng i ng i tr c đi n tho i, và ch đ i các cu c g i đ n. Ng i này không bi t ai s g i đ n và g i vào lúc nào, ch khi chuông reo thì anh ta m i nh c máy và nói v i b t c ai g i đ n. Chúng ta không th l p trình hành vi đó v i ch m t l p Socket.
Java cung c p l p ServerSocket cho phép ta vi t các server. V c b n nhi m v c a m t server socket gi ng nh m t ng i ng i tr c đi n tho i.
M t ServerSocket ho t đ ng trên m t server, và l ng nghe các liên k t đ n. M i ServerSocket l ng nghe trên m t c ng c th trên localhost. Khi m t socket cho client trên m t host xa th c hi n liên k t trên c ng đó, server ho t đ ng, th a thu n vi c liên k t gi a client và server, và m m t Socket gi a hai host. M t khác, socket cho server ch các liên k t đ n trong khi socket cho client kh i t o liên k t. M i khi server socket thi t l p m t liên k t, server s d ng Socket đ g i d li u cho client. D li u luôn luôn đ c truy n đi thông qua m t socket.
L p ServerSocket
L p ServerSocket có đ m i th b n c n đ vi t các server b ng Java. Nó có các constructor
đ t o các đ i t ng ServerSocket m i, các ph ng th c đ l ng nghe các liên k t trên m t c ng xác
đnh, và các ph ng th c tr v m t Socket khi liên k t đ c thi t l p, vì v y b n có th g i và nh n d li u.
Vòng đ i c a m tt server
1. M t ServerSocket m i đ c t o ra trên m t c ng xác đnh b ng cách s d ng m t constructor ServerSocket.
2. ServerSocket l ng nghe liên k t đ n trên c ng đó b ng cách s d ng ph ng th c accept(). Ph ng th c accept() phong t a cho t i khi m t client th c hi n m t liên k t, ph ng th c accept() tr v m t đ i t ng Socket mà liên k t gi a client và server.
3. Tùy thu c vào ki u server, ho c ph ng th c getInputStream(), getOutputStream() ho c c hai đ c g i đ nh n các lu ng vào ra đ truy n tin v i client.
4. server và client t ng tác theo m t giao th c th a thu n s n cho t i khi ng t liên k t. 5. Server, client ho c c hai ng t liên k t
6. Server tr v b c hai và đ i liên k t ti p theo.
Các constructor
public ServerSocket(int port)throws IOException, BindException
Constructor này t o m t socket cho server trên c ng xác đnh. N u port=0, h th ng ch n m t c ng ng u nhiên cho b n. C ng do h th ng ch n đôi khi đ c g i là c ng không công b vì b n không bi t s hi u c ng. V i các server, các c ng không tên không h u ích l m vì các client c n ph i bi t tr c c ng nào mà nó n i t i (gi ng nh ng i g i đi n tho i ngoài vi c xác đnh c n g i cho ai c n ph i bi t s đi n tho i đ liên l c v i ng i đó).
Ví d : t o m t server socket cho c ng 80 try{
ServerSocket httpd = new ServerSocket(80); }
- 52 -
catch(IOException e) {
System. err.println(e);
}
Constructor đ a ra ngo i l IOException n u b n không th t o và gán Socket cho c ng đ c yêu c u. Ngo i l IOException phát sinh khi:
+C ng đã đ c s d ng
+Không có quy n ho c c liên k t v i m t c ng n m gi a 0 và 1023. Ví d ;
import java.net.*; import java.io.*;
public class congLocalHost {
public static void main(String[] args) { ServerSocket ss; for(int i=0;i<=1024;i++) { try{ ss= new ServerSocket(i); ss.close(); } catch(IOException e) {
System.out.println("Co mot server tren cong "+i); }
} }
}
public ServerSocket(int port, int queuelength, InetAddress bindAddress)throws IOException
Constructor này t o m t đ i t ng ServerSocket trên c ng xác đnh v i chi u dài hàng đ i xác đnh. ServerSocket ch gán cho đa ch IP c c b xác đnh. Constructor này h u ích cho các server ch y trên các h th ng có nhi u đa ch IP.
public Socket accept() throws IOException
Khi b c thi t l p liên k t hoàn thành, và b n s n sàng đ ch p nh n liên k t, g i ph ng th c accept() c a l p ServerSocket. Ph ng th c này phong t a; nó d ng x lý, và đ i cho t i khi client k t n i. Khi client th c s k t n i, ph ng th c accept() tr v đ i t ng Socket. Ta s d ng các ph ng th c getInputStream() và getOutputStream()đ truy n tin v i client.
- 53 -
Ví d : try{
ServerSocket theServer = new ServerSocket(5776); while(true)
{
Socket con = theServer.accept();
PrintStream p = new PrintStream(con.getOutputStream()); p.println(“Ban da ket noi toi server nay. Bye-bye now.”); con.close(); } } catch(IOException e) { System.err.println(e); }
Ví d : Cài đ t m t server daytime import java.net.*;
import java.io.*; import java.util.Date; public class daytimeServer{
public final static int daytimePort =13; public static void main(String[]args) {
ServerSocket theServer;
Socket con;
PrintStream p;
try{
theServer = new ServerSocket(daytimePort);
try{ p= new PrintStream(con.getOutputStream()); p.println(new Date()); con.close(); } catch(IOException e) { theServer.close();
- 54 - System. err.println(e); } } catch(IOException e) { System. err.println(e); } } }
public void close() throws IOException
N u đã hoàn thành công vi c v i m t ServerSocket, ta c n ph i đóng nó l i, đ c bi t n u ch ng trình c a b n ti p t c ch y. i u này nh m t o đi u ki n cho các ch ng trình khác mu n s d ng nó. óng m t ServerSocket không đ ng nh t v i vi c đóng m t Socket.
Các ph ng th c get
public InetAddress getInetAddress()
Ph ng th c này tr v đa ch đ c s d ng b i server (localhost). N u localhost có đa ch IP, đa ch này đ c tr v b i ph ng th c InetAddress.getLocalHost()
Ví d : try{
ServerSocket httpd = new ServerSocket(80); InetAddress ia = httpd.getInetAddress(); }
catch(IOException e)
{ }
Ph ng th c public int getLocalHost()
Các contructor ServerSocket cho phép b n nghe d li u trên c ng không đnh tr c b ng cách gán s 0 cho c ng. Ph ng th c này cho phép b n tìm ra c ng mà server đang nghe.
Ví d
import java.net.*; import java.io.*; public class anon{ } V. L P TRÌNH APPLET Các ph ng th c m ng c a l p java.applet.Applet ̇ S d ng l p Applet đ t i d li u ̇ Giao di n ImageObserver ̇ L p MediaTracker
- 55 -
̇ Các ph ng th c m ng c a giao di n AppletContext ̇ M t s ch ng trình h u ích
M t trang web đ c thi t k s d ng trang html là m t trang web t nh. Vì th , thông tin đ c
đ a ra trong trang Web là không đ i. Gi ng nh v i b t k môi tr ng tr c quan nào, ph ng th c
đ ng đ c áp d ng cho m t trang web s làm cho m t trang web h p d n h n. Các ph ng th c đ ng trong m t trang Web:
̇ Dòng ch ch y
̇ Các thông báo đ c hi n th trên thanh tr ng thái ̇ Thay đ i các nh
có th áp d ng ph ng th c nh v y cho m t trang web; m t gi i pháp đ c đ a ra là s d ng java applet.
M t ch ng trình Java applet là m t ch ng trình đ c nhúng trong m t trang web. Vì v y, chúng ta có th vi t m t applet đ hi n th m t dòng ch ch y, và sau đó nhúng vào trang web, cung c p cho nó kh n ng hi n th dòng ch ch y.
So sánh gi a ng d ng đ c l p và ng d ng ký sinh
̇ ng d ng Java là m t ch ng trình đ c l p. i u này ngh a là ng d ng có th đ c ch y
đ c l p b ng dòng l nh.
̇ Java applet là m t ch ng trình mà ph i đ c ch y t m t trình duy t web hay m t ng d ng cho phép ch y java-appletviewer
̇ Java applet đ c ch y t trong m t trình duy t vì th có th s d ng t t c các c u trúc mà trình duy t cung c p.
Ví d , kh n ng qu n lý s ki n, giao di n ng i dùng.
̇ Java applet đ c đ a vào các trang html b ng cách s d ng các th <applet>. Khi ng i s d ng t i m t trang web ch a Java applet trong trình duy t c a nó, trình duy t t i applet v máy c c b và x lý bytecode trên máy c c b .
̇ Do applet đ c x lý trên máy c c b , các trình duy t h n ch các hành đ ng mà m t Applet có th th c hi n. i u này đ c th c hi n sao cho applet không gây nên b t k s c nào t i h th ng client.
Các h n ch c a Java Applet
D i đây là m t s h n ch đ c đ t ra b i các trình duy t này trên Java Applet: ̇ Applet không đ c phép đ c đ c t file hay ghi các file trên h th ng c c b . ̇ Applet ch có th truy n tin v i các server trên đó có ch a chính các applet.
̇ Applet không đ c phép x lý b t k các ng d ng trên máy c c b c ng không cho phép t i các th vi n liên k t đ ng.
L p Applet
B c đ u tiên trong vi c vi t m t Java Applet là xây d ng m t l p là l p con c a l p ‘Applet’, l p này là m t thành ph n c a Java API.
L p Applet đ c đnh ngh a trong gói ‘java.applet’ Dòng
import java.applet.*;
- 56 -
Chú ý:
Các l p đ c khai báo là l p con c a l p Applet ph i đ c khai báo là public, n u không trình duy t s không th t ng tác đ c v i l p này.
Vòng đ i c a m t applet
Java applet th a k các hành vi nh t đnh t l p Applet. B t k khi nào m t applet đ c t i, nó thay
đ i các tr ng thái
Các tr ng thái có th có c a m t applet: 1. Tr ng thái kh i t o (init()) 2. Kh i đ ng m t applet (start()) 3. V ho c v l i m t applet (paint()) Cu i cùng, khi applet b phá h y nó đi qua các tr ng thái:
1. Tr ng thái d ng (stop()) 2. Tr ng thái phá h y (destroy())
Tr ng thái kh i t o
Tr ng thái này đ c g i sau khi ng d ng ký sinh đ c n p. B t k khi nào m t applet đ c t o ra, ph ng th c init() s đ c g i. Trong ph ng th c này các bi n đ c kh i t o.
Chú ý: Ph ng th c này ch đ c g i m t l n trong su t chu trình s ng c a applet.
Cài đ t m c đnh c a ph ng th c init() nh đã th y trong l p ‘Applet’ không th c hi n công vi c gì. Ph ng th c này đ c n p ch ng trong l p ‘Applet’ đ th c hi n các cách kh i t o.