
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 cÇu tèi thiÓu c¸c b¹n ph¶i n¾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 sè ®Þ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 lµ 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 cã thÓ lËp tr×nh ®iÒu
khiÓn viÖc truyÒn th«ng gi÷a 2 m¸y sö dông c¸c giao thøc møc thÊp nh
TCP, UDP…, Socket lµ mét sù trõu tîng ho¸ ë møc cao, cã thÓ tëng tîng,
nã nh lµ mét thiÕt bÞ truyÒn th«ng 2 chiÒu t¬ng tù nh tÖ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
+ G¾n mét Socket víi mét ®Þa chØ, ®Þa chØ nµy chÝnh lµ ®Þ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 göi kh«ng ch¾c ch¾n th«ng ®iÖp cña hä cã ®Õn tay ngêi nhËn
kh«ng
mét th«ng ®iÖp cã thÓ göi nhiÒu lÇn
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:

Cã mét ®êng kÕt nèi “¶o” ®îc thµnh lËp gi÷a 2 tiÕn tr×nh, tríc khi
mét kÕ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, cã thÓ sö dông Socket ®Ó liªn l¹c theo m« h×nh
Client/Server. Trong m« h×nh nµy server sö dông lêi gäi listen vµ 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 mét sè líp cho phÐp c¸c øng dông m¹ng cã thÓ trao
®æi víi nhau qua c¬ chÕ Socket, cô thÓ líp Socket cung cÊp cho ta c¬
chÕ liªn l¹c trong chÕ ®é kÕt nèi (sö dông giao thøc TCP) vµ 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¸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 cã mét ®Þnh danh,
®Þnh danh nµy ph¶i lµ duy nhÊt, ®Þnh danh nµy ®îc thÓ 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
mé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 v×
nhiÒu nguyªn nh©n kh¸c nhau nh: m¸y ®ã khëi ®éng tõ xa hoÆc ®îc nèi
vµo nhµ cung cÊp dÞch vô Internet, do vËy mçi lÇn kÕt nèi vµo nhµ cung
cÊp dÞch vô ISP ta l¹i cã 1 ®Þa chØ IP kh¸c nhau. VËy thÕ th× lµm thÕ
nµo ®Ó ta cã 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µ 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 sè 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 vµ ngîc l¹i. Cã
mé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 vÒ ®Þa chØ IP díi d¹ng

m¶ng byte
public static InetAddress[]
getAllByName(String host)
throws
UnknownHostException
Tr¶ vÒ m¶ng ®èi tîng
InetAddress, v× mét m¸y cã thÓ
cã nhiÒu ®Þa chØ IP (do cã
nhiÒu card m¹ng), nªn ph¬ng
thøc nµy tr¶ vÒ mét m¶ng chøa
tÊt c¶ c¸c ®Þa chØ t¬ng øng víi
tªn miÒn.
public static InetAddress
getByName(String host)
throws
UnknownHostException
Tr¶ l¹i ®èi tîng InetAddress cã tªn
®îc chØ ra, tªn nµy lµ mét x©u kÝ
tù 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¶ vÒ ®è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 cã
ph¶i lµ ®Þa chØ Multicast kh«ng
Chó ý:
- Trong gãi java.net cßn líp Inet4Address vµ líp Inet6Address hai líp
nµy thÓ hiÖn cho c¸c ®Þa chØ IP version 4 vµ IP version 6, nã 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 cã
thÓ sö dông nã.
- Ph¬ng thøc getByName sÏ cã g¾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 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
nã sÏ cè g¾ng kÕt nè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× nã
sÏ sinh ra mét ngo¹i lÖ UnknownHostException, thÕ nªn b¹n cÇn
®Æt chóng vµo mét khèi try ..catch.

VÝ dô 1: Minh ho¹ c¸ch sö dông c¸c ph¬ng thøc getByName ®Ó t¹o ra mét
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");
}
}
}
KÕt qu¶ ch¹y ch¬ng tr×nh nh sau:
www.theht.edu.vn/127.0.0.1
Ngoµi c¸ch 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Òn vµo 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.");
}

}
}
KÕ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");
}
}
}
KÕ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
së dÜ cho kÕt qu¶ nh trªn lµ do m¸y cña t«i cã 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ã.
NÕu m¸y cña b¹n cã nèi m¹ng Internet b¹n cã thÓ kiÓm tra xem m¸y chñ
www.microsoft.com cña Microsoft ®îc cµi bao nhiªu bé giao tiÕp m¹ng
b»ng c¸ch thayInetAddress.getAllByName("www.theht.edu.vn"); bëi
InetAddress.getAllByName("www.microsoft.com");

