Bài giảng Mạng máy tính - Chương 7: Tầng ứng dụng - Phần 1: Lập trình Socket-Java - Ngô Hồng Sơn
Lꢀp trình socket
M
ꢂc
ñ
ích: làm th
ꢆ
nào ñꢇ xây dꢈng các ꢁng dꢂng
client/server truy
ꢅ
n d li u qua socket
ꢉ ꢊ
Socket API
socket
❒
ðưa ra trong BSD4.1 UNIX,
1981
Là giao diꢀn (cꢁa) do
ng t o ra trên máy
m, qu n lý b i OS qua
ứ
ng
❒
Cho phép ꢁng dꢂng tꢃo ra và
sꢄ dꢂng socket
d
ụ
ạ
ạ
ả
tr
ớ
❒
❒
Nguyên lý client/server
ñó các ꢂng dꢃng có thꢄ gꢁi
và nhꢅn thông ñiꢀp ñꢆn/tꢇ
các ꢂng dꢃng khác
Có hai dꢃng socket
ꢀ Truyꢅn gói tin, không tin
cꢀy
ꢀ Truyꢅn dòng bytes, tin cꢀy
1
Lꢀp trình socket vꢋiTCP
Socket: c
giao v
ch v TCP: truy
ñꢆn các ti n trình khác
ꢄ
ꢀ
a giao ti
n (UCP ho
n các bytes tin c
ꢆ
p gi
ꢉa các tiꢆn trình và giao thꢁc
ꢌc TCP)
D
ꢍ
ꢂ
ꢅ
ꢀy t
ꢎ
mꢏt tiꢆn trình
ꢆ
ðiꢊu khiꢄn bꢈi
Lꢅp trình viên
Tiꢆn trình
ðiꢊu khiꢄn bꢈi
Lꢅp trình viên
Tiꢆn trình
socket
socket
TCP vꢈi
Bꢉ ñꢀm,
Các biꢆn
TCP vꢈi
ðiꢊu khiꢄn bꢋi
Hꢀ ñiꢊu hành
ðiꢊu khiꢄn bꢋi
Hꢀ ñiꢊu hành
Bꢉ ñꢀm,
Các biꢆn
internet
Máy trꢌm,
máy chꢍ
Máy trꢌm,
máy chꢍ
2
Lꢀp trình socket vꢋi TCP
Client phꢐi gꢄi yêu cꢑu tꢋi server
❒
khi ñưꢓc client liên lꢃc, server
TCP tꢃo socket mꢋi ñꢇ tiꢆn
trình máy chꢒ giao tiꢆp vꢋi
client
❒
Tiꢆn trình máy chꢒ phꢐi ñang
ñưꢓc thꢈc hiꢊn
❒
máy chꢒ phꢐi mꢔ socket
(cꢕng) ñꢇ nhꢀn yêu cꢑu tꢎ
client
ꢀ cho phép nói chuyꢊn vꢋi
nhiꢅu clients
ꢀ phân biꢊt client bꢖng sꢘ
hiꢊu cꢕng (chương 3…)
Client yêu cꢑu server bꢖng cách:
❒
❒
Tꢃo mꢏt socket TCP trên máy
Chꢗ rõ IP address & port
number cꢒa tiꢆn trình máy chꢒ
ðꢎi vꢈi ꢂng dꢃng
❒
Khi client tꢃo socket: client
TCP tꢃo liên kꢆt tꢋi server
TCP
TCP cung c
bytes tin c
gi a client và server
ấ
p d
ị
ậ
ch v
ụ
truy n dòng
ề
y và có th
ứ ự
t
ữ
3
Tương tác giꢉa client/server qua socket
TCP
Server
(máy hostid)
Client
tꢃo socket,
port=x, cho yêu cꢑu tꢋi:
welcomeSocket =
ServerSocket()
Tꢌo liên kꢆt
tꢃo socket,
chꢙ yêu cꢑu tꢋi
kꢆt nꢘi tꢋi hostid, port=x
clientSocket =
Socket()
TCP
connectionSocket =
welcomeSocket.accept()
gꢄi yêu cꢑu tꢎ
clientSocket
nhꢀn yêu cꢑu tꢎ
connectionSocket
trꢐ lꢙi tꢃi
connectionSocket
ñꢚc trꢐ lꢙi tꢃi
clientSocket
ñóng socket
connectionSocket
ñóng
clientSocket
4
Stream
keyboard
monitor
❒
stream mꢏt chuꢛi ký tꢈ
vào/ra mꢏt tiꢆn trình.
input
stream
❒
❒
input stream ñưꢓc gꢜn vꢋi
mꢏt nguꢝn vào, e.g. bàn
phím, socket
Client
process
output stream ñưꢓc gꢜn vꢋi
mꢏt nguꢝn ra, e.g., màn hình
socket.
output
stream
input
stream
client TCP
socket
TCP
socket
to network
from network
5
Lꢀp trình socket vꢋi TCP
Ví dꢂ vꢅ ꢁng dꢂng client-server:
1) client ñꢚc các dòng văn bꢐn do ngưꢙi dùng gõ tꢎ
bàn phím (inFromUserstream) , g
ꢄ
i t
ꢋi server
qua socket (outToServerstream)
2) server ñꢚc các dòng g
ꢄ ꢎ socket
i t
3) server chuy
client
ꢇ
n sang ch
ꢉ
hoa và gꢄi trꢐ lꢃi cho
4) client ñꢚc và in lꢃi dòng văn bꢐn nhꢀn ñưꢓc tꢎ
socket (inFromServerstream)
6
Ví dꢂ: Java client (TCP)
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
Tꢌo
input stream
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Tꢌo
client socket,
nꢎi tꢈi server
Tꢌo
output stream
nꢎi tꢈi socket
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
7
Ví dꢂ: Java client (TCP), cont.
tꢌo
input stream
nꢎi tꢈi socket
BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
Gꢁi tꢈi
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
server
ñꢏc tin tꢇ
server
}
}
8
Ví dꢂ: Java server (TCP)
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
Tꢌo socket
chꢐ tꢌi port 6789
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
chꢐ yêu cꢑu
tꢇ client
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient =
new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
tꢌo input stream,
nꢎi tꢈi socket
9
Ví dꢂ: Java server (TCP), cont
tꢌo output
stream
nꢎi tꢈi socket
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
ñꢏc thông tin
clientSentence = inFromClient.readLine();
tꢇ socket
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
ghi ra socket
}
}
}
kꢆt thúc while loop
và chꢐ yêu cꢑu tꢇ client khác
10
Chương 2: Tꢑng ꢁng dꢂng
❒
2.6. L
TCP
ꢀ
p trình socket v
ꢋ
i
i
❒
2.1 Nguyên lý c
ꢒa các
ꢁ
ng d ng m ng
ꢂ
ꢃ
❒
2.7. L
UDP
ꢀp trình socket v
ꢋ
❒
❒
2.2 Web và HTTP
2.3 FTP – File Transfer
Protocol
❒
❒
2.4 Electronic Mail
ꢀ SMTP, POP3, IMAP
2.5 DNS
11
Lꢀp trình socket vꢋi UDP
UDP: không có liên kꢆt giꢉa
client và
❒
❒
không có giai ñoꢃn bꢜt tay
bên gꢄi chꢗ rõ IP address và
port number cꢒa phía nhꢀn
trên mꢛi gói tin
ðꢎi vꢈi ꢂng dꢃng
UDP cung c p d ch v
ấ
ị
ụ
truy
ề
a
n dữ
li u không tin c
ệ
ậy gi
ữ
❒
server sꢞ tìm ñꢍa chꢗ IP và sꢘ
hiꢊu cꢕng tương ꢁng bên
trong gói tin
client và server
UDP: các gói tin có thꢇ bꢍ mꢟt
hoꢌc ñꢆn không theo thꢁ tꢈ
12
Tương tác client/server qua UDP socket
Server (máy hostid)
Client
tꢃo socket,
tꢃo socket,
clientSocket =
DatagramSocket()
port=x, cho các y/c ñꢆn:
serverSocket =
DatagramSocket()
tꢃo gói tin, ñ/c (hostid, port=x,
gꢄi gói tin tꢎ clientSocket
ñꢚc y/c tꢎ
serverSocket
ghi trꢐ lꢙi lên
serverSocket
chꢗ rõ ñ/c, cꢕng
cꢒa client
ñꢚc trꢐ lꢙi tꢃi
clientSocket
ñóng
clientSocket
13
Ví dꢂ: Java client (UDP)
keyboard
monitor
input
stream
Client
process
Input: ñꢏc gói tin
nhꢒc lꢌi: TCP gꢁi
“byte stream”)
(
Output: gꢁi gói tin
(nhꢒc lꢌi: TCP gꢁi
“byte stream”)
UDP
packet
UDP
packet
client UDP
UDP
socket
socket
to network
from network
14
Ví dꢂ: Java client (UDP)
import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception
{
Tꢌo
input stream
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Tꢌo
client socket
DatagramSocket clientSocket = new DatagramSocket();
chuyꢄn ñꢓi
hostname ꢀ>IP
sꢁ dꢃng DNS
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
15
Ví dꢂ: Java client (UDP), cont.
Tꢌo datagram vꢈi
dataꢀtoꢀsend,
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
length, IP addr, port
clientSocket.send(sendPacket);
Gꢁi datagram
tꢈi server
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
ñꢏc datagram
tꢇ server
clientSocket.receive(receivePacket);
String modifiedSentence =
new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
16
Ví dꢂ: Java server (UDP)
import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception
{
Tꢌo
datagram socket
tꢌi cꢓng 9876
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true)
{
Tꢌo vùng ñꢀm
nhꢅn datagram
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
Nhꢅn
datagram
17
Ví dꢂ: Java server (UDP), cont
String sentence = new String(receivePacket.getData());
Lꢔy IP addr
InetAddress IPAddress = receivePacket.getAddress();
port # cꢍa ngưꢐi
gꢁi
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
Tꢌo datagram
DatagramPacket sendPacket =
ñꢄ gꢁi tꢈi client
new DatagramPacket(sendData, sendData.length, IPAddress,
port);
Ghi
datagram
serverSocket.send(sendPacket);
ra socket
}
}
}
Kꢆt thúc vòng while,
chꢐ datagram khác
18
Bạn đang xem tài liệu "Bài giảng Mạng máy tính - Chương 7: Tầng ứng dụng - Phần 1: Lập trình Socket-Java - Ngô Hồng Sơn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_mang_may_tinh_chuong_7_tang_ung_dung_phan_2_ngo_ho.pdf

