Ch¬ng ... LËp tr×nh Socket
I. C¸c kiÕn thøc liªn quan
Tríc khi b¾t ®Çu häc bµi nµy c¸c b¹n cÇn ®äc l¹i c¸c kiÕn thøc liªn quan
sau:
- Giao thøc, yªu u tèi thiÓu c¸c b¹n ph¶i m ®îc 3 giao thøc : IP, TPC,
UDP
- C¸ch ®¸nh ®Þa chØ IP, ®Þa chØ d¹ng tªn miÒn, giao thøc chuyÓn ®æi
®Þa chØ IP thµnh ®Þa chØ tªn miÒn, vµ ngîc l¹i
- Mét ®Þa chØ ®Æc biÖt: ®Þa chØ lÆp, ®Þa chØ broadcash,
multicash…
- Cæng giao thøc
- Ph©n biÖt ®îc sù kh¸c nhau, gièng nhau gi÷a 2 giao thøc TCP vµ UDP
1. Giíi thiÖu Socket
Socket mét giao diÖn lËp tr×nh øng (API - Application Program
Interface) dông m¹ng, th«ng qua giao diÖn nµy ta thÓ lËp tr×nh ®iÒu
khiÓn viÖc truyÒn th«ng gi÷a 2 m¸y dông c¸c giao thøc møc thÊp nh
TCP, UDP…, Socket mét trõu tîng ho¸ ë c cao, thÓ tëng tîng,
nh mét thiÕt truyÒn th«ng 2 chiÒu t¬ng nh p tin, chóng ta
göi/ nhËn d÷ liÖu gi÷a 2 m¸y, t¬ng tù nh viÖc ®äc/ ghi trªn tÖp tin.
§Ó liªn l¹c th«ng qua Socket, ta cÇn tiÕn hµnh c¸c thao t¸c:
- T¹o lËp hay më mét Socket
+ n mét Socket víi mét ®Þa chØ, ®Þa chØ nµy chÝnh ®Þa chØ cña
m¸y mµ nã cÇn liªn l¹c
+ Thùc hiÖn viÖc liªn l¹c, cã 2 kiÓu liªn l¹c tuú thuéc vµo chÕ ®é kÕt nèi:
a) liªn l¹c trong chÕ ®é kh«ng kÕt nèi:
Hai tiÕn tr×nh liªn l¹c víi nhau kh«ng kÕt nèi trùc tiÕp
mçi th«ng ®iÖp göi ®i ph¶i kÌm theo ®Þa chØ cña ngêi nhËn
H×nh thøc liªn l¹c nµy cã ®Æc ®iÓm:
ngêi i kh«ng ch¾c ch¾n th«ng ®iÖp cña cã ®Õn tay ngêi nhËn
kh«ng
t th«ng ®iÖp cã thÓ göi nhiÒun
th«ng ®iÖp göi sau cã thÓ ®Õn ®Ých tríc th«ng ®iÖp göi tríc ®ã
b) liªn l¹c trong chÕ ®é kÕt nèi:
mét ®êng kÕt nèi “¶o” ®îc thµnh lËp gi÷a 2 tiÕn tr×nh, tríc khi
t t nèi ®îc thµnh lËp th× mét trong 2 tiÕn tr×nh ph¶i ®îi tiÕn tr×nh kia
yªu cÇu kÕt nèi, thÓ dông Socket ®Ó liªn l¹c theo h×nh
Client/Server. Trong h×nh nµy server dông lêi gäi listen accept
®Ó l¾ng nghe vµ chÊp nhËn mét yªu cÇu kÕt nèi
2. LËp tr×nh Socket trong java
Java cung cËp t líp cho phÐp c¸c øng dông m¹ng thÓ trao
®æi víi nhau qua chÕ Socket, thÓ líp Socket cung cÊp cho ta
chÕ liªn l¹c trong chÕ ®é kÕt nèi (sö dông giao thøc TCP) líp
DatagramSocket cho phÐp c¸c øng dông m¹ng liªn l¹c víi nhau trong chÕ
®é kh«ng kÕt nèi (sö dông giao thøc UDP), tÊt c¸c líp liªn quan ®Õn
viÖc lËp tr×nh Socket ®îc java nhãm l¹i vµ ®Ó trong gãi java.net
II. Kh¶o s¸t mét sè líp trong gãi java.net
1. líp InetAddress
Mçi mét m¸y khi tham gia truyÒn th«ng cÇn ph¶i mét ®Þnh danh,
®Þnh danh y ph¶i duy nhÊt, ®Þnh danh y ®îc t hiÖn b»ng ®Þa
chØ IP hoÆc ®Þa chØ díi d¹ng tªn miÒn. Líp InetAddress biÓu thÞ cho
t ®Þa chØ cña mét m¸y nµo ®ã, khi ta muèn liªn l¹c víi mét m¸y ë xa, ta
ph¶i biÕt ®îc ®Þa chØ IP cña m¸y ë xa, tuy nhiªn ®Þa chØ IP th× rÊt khã
nhí, ®«i khi ta kh«ng thÓ biÕt chÝnh x¸c ®Þa chØ IP cña m¸y ®ã, bëi
nhiÒu nguyªn nh©n kh¸c nhau nh: m¸y ®ã khëi ®éng xa hoÆc ®îc nèi
vµo n cung cÊp dÞch Internet, do y mçi lÇn kÕt i vµo nhµ cung
cÊp dÞch ISP ta l¹i 1 ®Þa chØ IP kh¸c nhau. VËy thÕ th× lµm thÕ
nµo ®Ó ta thÓ liªn l¹c víi m¸y ë xa khi ta chØ biÕt ®Þa chØ m¸y ®ã díi
d¹ng tªn miÒn?, c©u tr¶ lêi líp InetAddress ®· lµm ®iÒu ®ã cho ta, líp
nµy tù ®éng chuyÓn ®Þa chØ d¹ng tªn miÒn thµnh ®Þa chØ IP vµ ngîc l¹i.
Líp InetAddress cung cÊp mét ph¬ng thøc tÜnh (static) dïng ®Ó
chuyÓn ®æi dÞa chØ díi d¹ng tªn miÒn thµnh ®Þa chØ IP ngîc l¹i.
t sè ph¬ng thøc sau mµ b¹n cÇn quan t©m:
Ph¬ng ph¸p M« t¶
Public void equals( Object obj) So s¸nh 2 ®èi tîng
Public byte[] getAddress() LÊy ®Þa chØ IP díi d¹ng
m¶ng byte
public static InetAddress[]
getAllByName(String host)
throws
UnknownHostException
Tr¶ m¶ng ®èi tîng
InetAddress, mét m¸y thÓ
nhiÒu ®Þa chØ IP (do
nhiÒu card m¹ng), nªn ph¬ng
thøc nµy tr¶ mét m¶ng chøa
tÊt c¸c ®Þa chØ t¬ng øng víi
tªn miÒn.
public static InetAddress
getByName(String host)
throws
UnknownHostException
Tr¶ i ®èi tîng InetAddress tªn
®îc chØ ra, tªn nµy lµ mét u kÝ
díi d¹ng tªn miÒn hoÆc ®Þa
chØ IP
public String getHostAddress() Tr¶ vÒ ®Þa chØ IP cña m¸y chñ
public String getHostName() Tr¶ vÒ tªn cña m¸y chñ
public static InetAddress
getLocalHost()
throws
UnknownHostException
Tr¶ ®èi tîng InetAddress kÕt
hîp víi chÝnh m¸y ®ã
public boolean
isMulticastAddress()
KiÓm tra xem ®Þa chØ nµy
ph¶i lµ ®Þa chØ Multicast kh«ng
Chó ý:
- Trong gãi java.net cßn líp Inet4Address líp Inet6Address hai líp
nµy thÓ hiÖn cho c¸c ®Þa chØ IP version 4 IP version 6, gåm
tÊt c¶ c¸c thµnh phÇn cña líp InetAddress
- Ta cÇn thªm mÖnh ®Ò import líp java.net.InetAddress tríc khi
thÓ sö dông nã.
- Ph¬ng thøc getByName ng ph©n gi¶i tªn miÒn thµnh ®Þa
chØ IP t¬ng øng b»ng c¸ch: Tríc tiªn ®i t×m trong cache, nÕu
kh«ng t×m thÊy nã t×m tiÕp trong tÖp host, nÕu vÉn kh«ng t×m thÊy
ng kÕt i ®Õn m¸y chñ DNS ®Ó yªu cÇu ph©n gi¶i tªn
nµy thµnh ®Þa chØ IP, nÕu kh«ng thÓ ph©n gi¶i ®îc tªn nµy th×
sinh ra mét ngo¹i UnknownHostException, thÕ nªn b¹n cÇn
®Æt chóng vµo mét khèi try ..catch.
1: Minh ho¹ c¸ch dông c¸c ph¬ng thøc getByName ®Ó t¹o rat
InetAddress
import java.net.*;
class InetAddress1 {
public static void main(String[] args) {
try {
InetAddress address =
InetAddress.getByName("www.theht.edu.vn");
System.out.println(address);
}
catch (UnknownHostException ex) {
System.out.println("Could not find www.theht.edu.vn");
}
}
}
t qu¶ ch¹y ch¬ng tr×nh nh sau:
www.theht.edu.vn/127.0.0.1
Ngoµich truyÒn vµo ph¬ng thøc getByName mét x©u ký tù thÓ hiÖn tªn
m¸y b¹n ta thÓ truyÒno mét x©u thÓ hiÖn ®Þa chØ IP cña m¸y nh sau:
InetAddress address =
InetAddress.getByName("192.168.101.1");
VÝ dô 2: T¹o ra mét InetAddress t¬ng øng víi m¸y côc bé:
import java.net.*;
class MyAddress {
public static void main(String[] args) {
try {
InetAddress address = InetAddress.getLocalHost();
System.out.println(address);
}
catch (UnknownHostException ex) {
System.out.println("Could not find this computer's address.");
}
}
}
t qu¶ ch¹y ch¬ng tr×nh nh sau:
theht1/192.168.101.1
VÝ dô 3: NÕu m¸y b¹n cã cµi nhiÒu card m¹ng b¹n cã thÓ lÊy vÒ mét m¶ng
c¸c InetAddess t¬ng øng víi ®Þa chØ IP cho tõng card m¹ng ®ã:
import java.net.*;
class AllAddressesOfTheht {
public static void main(String[] args) {
try {
InetAddress[] addresses =
InetAddress.getAllByName("www.theht.edu.vn");
for (int i = 0; i < addresses.length; i++) {
System.out.println(addresses[i]);
}
}
catch (UnknownHostException ex) {
System.out.println("Could not find www.theht.edu.vn");
}
}
}
t qu¶ ch¹y ch¬ng tr×nh nh sau:
www.theht.edu.vn /192.168.101.1
www.theht.edu.vn /10.0.0.2
www.theht.edu.vn /162.163.10.5
www.theht.edu.vn /3.152.90.25
cho t qu¶ nh trªn do m¸y cña t«i cµi 4 card m¹ng, t¬ng øng
víi mçi card m¹ng t«i ®Æt mét dÞa chØ IP cho nã.
u m¸y cña b¹n nèi m¹ng Internet b¹n thÓ kiÓm tra xem m¸y chñ
www.microsoft.com cña Microsoft ®îc i bao nhiªu bé giao tiÕp m¹ng
b»ng ch thayInetAddress.getAllByName("www.theht.edu.vn"); i
InetAddress.getAllByName("www.microsoft.com");