Bài giảng Mạng máy tính - Chương 5: Lập trình socket - Nguyễn Hồng Sơn

• 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

pdf23 trang | Chia sẻ: candy98 | Lượt xem: 650 | Lượt tải: 0download
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