• Tổng quan
• Lập trình Socket với TCP
• Lập trình Socket với UDP
Tổng quan
Viết chương trình
– Chạy trên các hệ thống đầu
cuối
– Truyền thông qua mạng
– Ví dụ web server giao tiếp
với browser
Viết chương trình trên các
thiết bị mạng ngoài phạm
vi này.
Lập trình socket
Mục tiêu: biết cách xây dựng một ứng dụng
client/server giao tiếp bằng socket.
Socket API
• Được giới thiệu trong BSD4.1
UNIX, 1981
• Được khởi tạo, sử dụng và hủy
một cách tường minh bởi ứng
dụng
• Mô hình client/server
• Hai loại dịch vụ truyền tải qua
socket API:
– Datagram không bảo đảm
– connection-oriented bảo
đảm
23 trang |
Chia sẻ: candy98 | Lượt xem: 650 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Mạng máy tính - Chương 5: Lập trình socket - Nguyễn Hồng Sơn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 5
Lập trình socket
NỘI DUNG
• Tổng quan
• Lập trình Socket với TCP
• Lập trình Socket với UDP
Tổng quan
Viết chương trình
– Chạy trên các hệ thống đầu
cuối
– Truyền thông qua mạng
– Ví dụ web server giao tiếp
với browser
Viết chương trình trên các
thiết bị mạng ngoài phạm
vi này
application
transport
network
data link
physical
application
transport
network
data link
physical
application
transport
network
data link
physical
Lập trình socket
Socket API
• Được giới thiệu trong BSD4.1
UNIX, 1981
• Được khởi tạo, sử dụng và hủy
một cách tường minh bởi ứng
dụng
• Mô hình client/server
• Hai loại dịch vụ truyền tải qua
socket API:
– Datagram không bảo đảm
– connection-oriented bảo
đảm
Một giao tiếp cục bộ
trên host, được tạo
bởi ứng dụng và được
điều khiển bởi hệ
điều hành, qua đó quá
trình ứng dụng có thể
truyền (hay nhận) đến
(hay từ) quá trình
khác
socket
Mục tiêu: biết cách xây dựng một ứng dụng
client/server giao tiếp bằng socket
Giao tiếp giữa các quá trình trên hai host
khác nhau
• process truyền/nhận
thông điệp đến/từ socket
của nó
• socket tương tự như cửa
ra vào
– Quá trình truyền thông
điệp ra cửa
– Quá trình truyền dựa vào
hạ tầng truyền tải trên
phía kia của cánh cửa,
thông tin được chuyển đến
socket của quá trình thu
process
TCP với
Buffer và
các biến
socket
host hay
server
process
TCP với
Buffer và
các biến
socket
host hay
server
Internet
Kiểm soát bởi
hệ điều hành
Kiểm soát bởi
người lập trình
• API: (1) chọn giao thức truyền tải ; (2) khả năng sửa một vài
thông số
NỘI DUNG
• Tổng quan
• Lập trình Socket với TCP
• Lập trình Socket với UDP
Lập trình socket với TCP
Socket: Như là cửa thông giữa các quá trình ứng
dụng và giao thức truyền tải end-to-end (UCP hay
TCP)
TCP service: truyền tải bảo đảm cho các byte từ một
process đến một process khác
process
TCP với
Buffer và
các biến
socket
Được kiểm soát bởi
người lập trình
ứng dụng
Được kiểm soát bởi
hệ điều hành
host hay
server
process
TCP với
Buffer và
các biến
socket
host hay
server
internet
Được kiểm soát bởi
người lập trình
ứng dụng
Được kiểm soát bởi
hệ điều hành
Lập trình socket với TCP
Client phải liên lạc với server
• Trước hết quá trình trên
server phải chạy
• server phải tạo socket để
đón tiếp client
Client liên lạc server bằng:
• Tạo TCP socket
• Chỉ ra IP address, port
number của quá trình trên
server
• Khi client tạo socket: client
TCP thiết lập kết nối đến
server TCP
• Khi được liên hệ bởi client,
server TCP tạo socket mới
để quá trình server giao tiếp
với client
– Cho phép server giao tiếp
với nhiều quá trình client
– Các chỉ số port được dùng
để phân biệt các client
TCP cung cấp dịch vụ truyền tải có
trật tự và bảo đảm giữa client và
server
Từ góc độ ứng dụng
Tương tác giữa client socket và server
socket qua TCP
Đợi yêu cầu
kết nối đến
connectionSocket =
welcomeSocket.accept()
Tạo socket,
port=x, để đón yêu cầu:
welcomeSocket =
ServerSocket()
Tạo socket,
connect to hostid, port=x
clientSocket =
Socket()
close
connectionSocket
Đọc phản hồi từ
clientSocket
close
clientSocket
Server Client
Gửi yêu cầu dùng
clientSocketĐọc yêu cầu từ
connectionSocket
Ghi phản hồi ra
connectionSocket
TCP
Thiết lập kết nối
ou
t
T
o
S
e
r
v
e
r
to network from network
i
n
F
r
o
m
S
e
r
v
e
r
i
n
F
r
o
m
U
s
e
r
keyboard monitor
Process
clientSocket
input
stream
input
stream
output
stream
TCP
socket
Client
process
client TCP
socket
Thuật ngữ Stream
• Stream là một tuần tự
các ký tự đi vào hay đi ra
một quá trình.
• Một input stream được
kết với một nguồn nhập
của quá trình, ví dụ bàn
phím hay socket.
• Một output stream được
kết với một đích đến của
quá trình, ví dụ màn hình
hay socket.
Ví dụ ứng dụng client-server
1) client đọc dòng ký tự từ đầu vào chuẩn
(inFromUser stream), rồi gửi đến server
qua socket (outToServer stream)
2) server đọc dòng ký tự từ socket
3) server đổi các dòng ký tự thành chữ hoa, gửi
ngược lại cho client
4) client đọc và in dòng ký tự từ socket
(inFromServer stream)
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;
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,
kết nối đến server
Tạo
output stream
gắn vào socket
Ví dụ: Java client (TCP) (tiếp theo).
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
gắn vào socket
Gửi dòng ký
tự đến server
Đọc dòng ký
tự từ server
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;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient =
new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
Tạo
welcoming socket
Tại port 6789
Đợi client liên hệ
Tạo input stream,
gắn vàosocket
Ví dụ: Java server (TCP) (tiếp theo)
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
Đọc dòng ký
tự từ socket
Tạo output stream,
gắn vào socket
Ghi dòng
ký tự ra socket
Kết thúc vòng lặp while,
trở lại chờ kết nối khác từ client
NỘI DUNG
• Tổng quan
• Lập trình Socket với TCP
• Lập trình Socket với UDP
Lập trình socket với UDP
UDP: không có kết nối giữa
client và server
• Không bắt tay
• sender gắn địa chỉ IP và
port của đích vào mỗi
gói
• server phải tách địa chỉ
IP và port của client từ
gói nhận được
UDP: data có thể không
đúng thứ tự ở máy thu
hay mất
Từ góc độ ứng dụng
UDP cung cấp dịch vụ
truyền tải không bảo đảm
giữa client và server
Tương tác giữa client socket và server
socket qua UDP
Server
close
clientSocket
Đọc datagram từ
clientSocket
Tạo socket,
clientSocket =
DatagramSocket()
Client
Tạo datagram với server IP và
port=x; gửi datagram qua
clientSocket
Tạo socket,
port= x.
serverSocket =
DatagramSocket()
Đọc datagram từ
serverSocket
Ghi phản hồi ra
serverSocket
chỉ ra
client address,
port number
Ví dụ: Java client (UDP)
s
e
n
d
P
a
c
k
e
t
to network from network
r
e
c
e
i
v
e
P
a
c
k
e
t
i
n
F
r
o
m
U
s
e
r
keyboard monitor
Process
clientSocket
UDP
packet
input
stream
UDP
packet
UDP
socket
Output: truyền
packet (TCP gửi
dòng byte)
Input: nhận packet
Client
process
client UDP
socket
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();
Tạo
input stream
Tạo
client socket
Thông dịch
hostname sang IP
address dùng DNS
Ví dụ: Java client (UDP) (tiếp theo)
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,
length, IP addr, port
Gửi datagram
đến server
Đọc datagram
từ server
Vi 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 port 9876
Tạo chỗ cho
datagram nhận
Nhận
datagram
Ví dụ: Java server (UDP) (tiếp theo)
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
sender
ghi
datagram
Ra socket
Kết thúc vòng lặp while,
trở lại chờ datagram khác
Tạo datagram để
gửi cho client