Giao tiếp giữa các quá trình trên hai host – 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ớ
Trang 1Chương 5
Lập trình socket
Trang 3Tổ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
application
transport network data link physical
application
transport network data link physical
Trang 4Lậ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
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
Trang 5Giao tiếp giữa các quá trình trên hai host
– 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ớiBuffer vàcác biếnsocket
host hayserver
process
TCP vớiBuffer vàcác biếnsocket
host hayserver
Trang 7Lập trình socket với TCP
dụng và giao thức truyền tải end-to-end (UCP hay TCP)
process đến một process khác
process
TCP với Buffer và các biến
process
TCP vớiBuffer 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
Trang 8Lậ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 để
• 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
Trang 9Tươ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()
Trang 10input stream
output stream
TCP socket
Client process
client TCP socket
Trang 11Ví 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
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)
Trang 12DataOutputStream 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
Trang 13Ví dụ: Java client (TCP) (tiếp theo).
BufferedReader inFromServer = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine();
Tạo input stream
Trang 14BufferedReader inFromClient = new BufferedReader(newInputStreamReader(connectionSocket.getInputStream()));
Tạo welcoming socket
Tại port 6789
Đợi client liên hệ
Tạo input stream,
gắn vàosocket
Trang 15Ví dụ: Java server (TCP) (tiếp theo)
Trang 17Lập trình socket với UDP
UDP: không có kết nối giữa
• server phải tách địa chỉ
IP và port của client từ
Trang 18Tương tác giữa client socket và server
socket qua UDP
serverSocket = DatagramSocket()
Trang 19Ví dụ: Java client (UDP)
input stream
UDP packet
UDP socket
client UDP socket
Trang 20Ví 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
Trang 21Ví 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
Trang 22Vi 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
Trang 23Ví 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