bàn phím, socket ❒ output stream ñược gắn với một nguồn ra, e.g., màn hình socket... Ví d ụ : Java client TCPimport java.io.*; import java.net.*; class TCPClient { public static void
Trang 1L ậ p trình socket
Socket API
1981
❒ Cho phép ứ ng d ụ ng t ạ o ra và
s ử d ụ ng socket
Truy ề n gói tin, không tin
c ậ y
Truy ề n dòng bytes, tin c ậ y
Là giao diện (cửa) do ứ ng
d ụ ng t ạ o ra trên máy
tr ạ m, qu ả n lý b ớ i OS qua
ñó 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
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
Trang 2L ậ p trình socket v ớ iTCP
Socket: c ử a giao ti ế p gi ữ a các ti ế n trình và giao th ứ c
giao v ậ n (UCP ho ặ c TCP)
D ị ch v ụ TCP: truy ề n các bytes tin c ậ y t ừ m ộ t ti ế n trình
ñế n các ti ế n trình khác
Tiến trình
TCP với
Bộ ñệm, Các biến
socket
ðiều khiển bới
Lập trình viên
ðiều khiển bởi
Hệ ñiều hành
Máy trạm, máy chủ
Tiến trình
TCP với
Bộ ñệm, Các biến
socket
internet
ðiều khiển bới Lập trình viên
ðiều khiển bởi
Hệ ñiều hành
Máy trạm, máy chủ
Trang 3L ậ p trình socket v ớ i TCP
Client ph ả i g ử i yêu c ầ u t ớ i server
❒ 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
Client yêu c ầ u server b ằ ng cách:
❒ Chỉ rõ IP address & port
number của tiến trình máy chủ
❒ Khi client t ạ o socket : client
TCP t ạ o liên k ế t t ớ i server
TCP
❒ 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
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…)
TCP cung c ấ p d ị ch v ụ truy ề n dòng
bytes tin c ậ y và có th ứ t ự
gi ữ a client và server
ðối với ứng dụng
Trang 4T ươ ng tác gi ữ a client/server qua socket
TCP
connectionSocket = welcomeSocket.accept()
welcomeSocket = ServerSocket()
k ế t n ố i t ớ ihostid, port=x
clientSocket =
Socket()
connectionSocket
ñọ c tr ả l ờ i t ạ i
clientSocket
ñ óng
clientSocket
Server
(máy hostid )
Client
clientSocket
connectionSocket
connectionSocket
Tạo liên kết TCP
Trang 5to network from network
keyboard monitor
Process
clientSocket
input stream
input stream
output stream
TCP socket
Client process
client TCP socket
Stream
❒ stream m ộ t chu ỗ i ký t ự
vào/ra m ộ t ti ế n trình.
❒ input stream ñượ c g ắ n v ớ i
m ộ t ngu ồ n vào, e.g bàn
phím, socket
❒ output stream ñược gắn với
một nguồn ra, e.g., màn hình
socket.
Trang 6L ậ 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 ( inFromUser stream) , g ử i t ớ i server
2) server ñọ c các dòng g ử i t ừ socket
3) server chuy ể n sang ch ữ hoa và g ử i tr ả l ạ i cho
client
4) client ñọ c và in l ạ i dòng v ă n b ả n nh ậ n ñượ c t ừ
Trang 7Ví d ụ : Java client (TCP)
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception {
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
Tạo input stream
Tạo client socket,
nối tới server
Tạo output stream
nối tới socket
Trang 8Ví d ụ : Java client (TCP), cont.
BufferedReader inFromServer = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close();
} }
tạo input stream
nối tới socket
Gửi tới server ñọc tin từ server
Trang 9Ví d ụ : Java server (TCP)
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception {
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) { Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
Tạo socket
chờ tại port 6789
chờ yêu cầu
từ client tạo input stream,
nối tới socket
Trang 10Ví d ụ : Java server (TCP), cont
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
} } }
ñọc thông tin
từ socket
tạo output
stream
nối tới socket
ghi ra socket
kết thúc while loop
và chờ yêu cầu từ client khác
Trang 11Ch ươ ng 2: T ầ ng ứ ng d ụ ng
❒ 2.1 Nguyên lý c ủ a các
❒ 2.3 FTP – File Transfer
Protocol
❒ 2.4 Electronic Mail
❒ 2.6 L ậ p trình socket v ớ i TCP
❒ 2.7 L ậ p trình socket v ớ i UDP
Trang 12L ậ 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
port number của phía nhận
trên mỗi gói tin
❒ server s ẽ tìm ñị a ch ỉ IP và s ố
hi ệ u c ổ ng t ươ ng ứ ng bên
trong gói tin
UDP: các gói tin có th ể b ị m ấ t
ho ặ c ñế n không theo th ứ t ự
ðối với ứng dụng
UDP cung c ấ p d ị ch v ụ truy ề n d ữ
li ệ u không tin c ậ y gi ữ a client và server
Trang 13T ươ ng tác client/server qua UDP socket
ñ óng
clientSocket
ñọ c tr ả l ờ i t ạ i
clientSocket
clientSocket = DatagramSocket()
Client
serverSocket =
DatagramSocket()
serverSocket
serverSocket
Trang 14Ví d ụ : Java client (UDP)
to network from network
keyboard monitor
Process
clientSocket
UDP packet
input stream
UDP packet
UDP socket
Output: gửi gói tin (nhắc lại: TCP gửi
“byte stream”)
Input: ñọc gói tin
(nhắc lại: TCP gửi
“byte stream”)
Client process
client UDP socket
Trang 15Ví d ụ : Java client (UDP)
import java.io.*;
import java.net.*;
class UDPClient { public static void main(String args[]) throws Exception {
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
Tạo input stream
Tạo client socket
chuyển ñổi
hostname ->IP
sử dụng DNS
Trang 16Ví d ụ : Java client (UDP), cont.
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
} }
Tạo datagram với
data-to-send,
length, IP addr, port
Gửi datagram
tới server ñọc datagram
từ server
Trang 17Ví d ụ : Java server (UDP)
import java.io.*;
import java.net.*;
class UDPServer { public static void main(String args[]) throws Exception {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket);
Tạo datagram socket
tại cổng 9876
Tạo vùng ñệm
nhận datagram
Nhận datagram
Trang 18Ví d ụ : Java server (UDP), cont
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,
port);
serverSocket.send(sendPacket);
} } }
Lấy IP addr
port # của người
gửi
Ghi datagram
ra socket
Kết thúc vòng while, chờ datagram khác Tạo datagram
ñể gửi tới client