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
application transport network data link physical
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
application transport network data link physical
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
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 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 API: – Datagram không bảo đảm – connection-oriented bảo
đảm
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ó
host hay server host hay server
• socket tương tự như cửa
Kiểm soát bởi người lập trình process process
ra vào – Quá trình truyền thông
socket socket
điệp ra cửa
Internet
TCP với Buffer và các biến TCP với Buffer và các biến
– 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
• API: (1) chọn giao thức truyền tải ; (2) khả năng sửa một vài
thông số
Kiểm soát bởi hệ điều hành
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
process
Được kiểm soát bởi người lập trình ứng dụng
Đượ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
Được kiểm soát bởi hệ điều hành
socket TCP với Buffer và các biến
internet
socket TCP với Buffer và các biến
host hay server
host hay server
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
• 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
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
Từ góc độ ứng dụng
• Khi client tạo socket: client TCP thiết lập kết nối đến server TCP
TCP cung cấp dịch vụ truyền tải có trật tự vàbảo đảm giữa client và server
Server
Tương tác giữa client socket và server socket qua TCP Client
Tạo socket, port=x, để đón yêu cầu:
welcomeSocket = ServerSocket()
TCP Thiết lập kết nối
Tạo socket, connect to hostid, port=x clientSocket = Socket()
Đợi yêu cầu kết nối đến connectionSocket = welcomeSocket.accept()
Gửi yêu cầu dùng clientSocket
Đọc yêu cầu từ connectionSocket
Ghi phản hồi ra connectionSocket
Đọc phản hồi từ clientSocket
close connectionSocket
close clientSocket
Thuật ngữ Stream
keyboard
monitor
• Stream là một tuần tự
input stream
các ký tự đi vào hay đi ra một quá trình.
r e s U m o r F n
i
Client Process process
• 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.
output stream
input stream
t
r e v r e S o T u o
r e v r e S m o r F n
i
client TCP clientSocket socket
TCP 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.
to network
from network
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 =
Tạo input stream
new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
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 =
Tạo input stream gắn vào socket
new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
Gửi dòng ký tự đến server
modifiedSentence = inFromServer.readLine();
Đọc dòng ký tự từ server
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
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;
Tạo welcoming socket Tại port 6789
ServerSocket welcomeSocket = new ServerSocket(6789);
Đợi client liên hệ
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient =
Tạo input stream, gắn vàosocket
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
Ví dụ: Java server (TCP) (tiếp theo)
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
Đọc dòng ký tự từ socket
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
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
Tạo output stream, gắn vào socket
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
Từ góc độ ứng dụng
• Không bắt tay • sender gắn địa chỉ IP và port của đích vào mỗi gói
UDP cung cấp dịch vụ truyền tải không bảo đảm giữa clientvàserver
• 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ương tác giữa client socket và server socket qua UDP
Server
Client
Tạo socket, clientSocket = DatagramSocket()
Tạo socket, port= x. serverSocket = DatagramSocket()
Tạo datagram với server IP và port=x; gửi datagram qua clientSocket
Đọc datagram từ serverSocket
Đọc datagram từ clientSocket
Ghi phản hồi ra serverSocket chỉ ra client address, port number
close clientSocket
Ví dụ: Java client (UDP)
keyboard
monitor
input stream
r e s U m o r F n
i
Client Process process
Input: nhận packet
UDP packet
UDP packet
i
t e k c a P d n e s
t e k c a P e v e c e r
client UDP clientSocket socket
UDP socket
to network
from network
Output: truyền packet (TCP gửi dòng byte)
Ví dụ: Java client (UDP)
import java.io.*; import java.net.*;
class UDPClient {
Tạo input stream
public static void main(String args[]) throws Exception {
BufferedReader inFromUser =
Tạo client socket
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
Thông dịch hostname sang IP address dùng DNS
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
Ví dụ: Java client (UDP) (tiếp theo)
DatagramPacket sendPacket =
Tạo datagram với data, length, IP addr, port
new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
Gửi datagram đến server
clientSocket.send(sendPacket);
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
Đọc datagram từ server
clientSocket.receive(receivePacket);
String modifiedSentence =
new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }
}
Vi dụ: Java server (UDP)
import java.io.*; import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception
{
Tạo datagram socket tại port 9876
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024];
while(true)
{
Tạo chỗ cho datagram nhận
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
Nhận datagram
serverSocket.receive(receivePacket);
Ví dụ: Java server (UDP) (tiếp theo)
String sentence = new String(receivePacket.getData());
Lấy IP addr port #, của sender
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
Tạo datagram để gửi cho client
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress,
port);
serverSocket.send(sendPacket);
ghi datagram Ra socket
}
}
Kết thúc vòng lặp while, trở lại chờ datagram khác
}