Tương tác giữa client/server qua socket TCP chờ yêu cầu tới connectionSocket = welcomeSocket.accept tạo socket, port=x, cho yêu cầu tới: welcomeSocket = ServerSocket tạo socket, kết nối
Trang 1Lập trình socket
Socket API
Đưa ra trong BSD4.1 UNIX,
1981
Cho phép ứng dụng tạo ra và
sử dụng socket
Nguyên lý client/server
Có hai 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
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, ạ
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:
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ủ
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
chờ yêu cầu tới
connectionSocket = welcomeSocket.accept()
tạo socket,
port=x, cho yêu cầu tới:
welcomeSocket = ServerSocket()
tạo socket,
kết nối tới hostid, port=x
clientSocket =
Socket()
đóng socket
connectionSocket
đọc trả lời tại
clientSocket
đóng
Server
(máy hostid)
Client
gửi yêu cầu từ
clientSocket
nhận yêu cầu từ
connectionSocket
trả lời tại
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:
bàn phím (inFromUser stream) , gửi tới server
qua socket (outToServer stream)
client
socket (inFromServer stream)
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();
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 =
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
ứng dụng mạng
2.2 Web và HTTP
2.3 FTP – File Transfer
Protocol
2.4 Electronic Mail
SMTP, POP3, IMAP
2.5 DNS
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
bên gửi chỉ rõ IP address và
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
Server (máy hostid)
đọc trả lời tại
clientSocket
tạo socket,
clientSocket = DatagramSocket()
Client
tạo gói tin, đ/c (hostid, port=x,
tạo socket,
port=x, cho các y/c đến:
serverSocket =
DatagramSocket()
đọc y/c từ
serverSocket
ghi trả lời lên
serverSocket
chỉ rõ đ/c, cổng của client
Trang 14Ví dụ: Java client (UDP)
to network from network
keyboard monitor
Process
clientSocket
UDP packet
input stream
UDP packet
UDP socket
“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 ể ử ớ