Ví d ụ : Java client TCPimport java.io.*; import java.net.*; class TCPClient { public static void mainString argv[] throws Exception { String sentence; String modifiedSentence; Buf
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
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:
❒ 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
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
qua socket ( outToServer stream)
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 ừ
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();
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
ứ ng d ụ ng m ạ ng
❒ 2.2 Web và HTTP
❒ 2.3 FTP – File Transfer
Protocol
❒ 2.4 Electronic Mail
❒ 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
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