1
Lậ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
ớ
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
ế
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
ñóng socket
connectionSocket
ñọc trả lời tại
clientSocket
ñóng
clientSocket
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
5
outToServer
to network from network
inFromServer
inFromUser
keyboard monitor
Process
clientSocket
input
stream
input
stream
output
ườ
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
Tạo
input stream
Tạo
client socket,
nối tới server
Tạo
output stream
nối tới socket
8
Ví 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
9
}
ñọ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
11
Chươ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
❒
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
13
Tươ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 =
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
15
Ví 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();
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
18
Ví 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);