Lập trình mạng với java (Bài 6)
Lập trình mạng với java sẽ cho các bạn biết đến các hệ thống mạng khác nhau cùng làm việc thông qua môi trường mạng như mạng LAN, mạng WAN hay mạng Internet. Và lập trình mạng là tạo ra các ứng dụng làm việc với nhau thông qua môi trường mạng như ứng dụng chat Skype, ứng dụng Zalo, …
Các ứng dụng làm việc trong môi trường mạng giao tiếp với nhau thông qua giao thức mạng (network protocol). Trong Java cung cấp hai giao thức mạng phổ biến là TCP (Transmission Control Protocol) và UDP (User Datagram Protocol).
Như vậy, khi hai ứng dụng trên hai máy tính muốn giao tiếp trực tuyến với nhau thì đầu tiên chúng phải thiết lập một kết nối. Sau khi một kết nối được thiết lập, những ứng dụng này có thể gửi và nhận dữ liệu qua lại với nhau dựa trên kêt nối đó.
Lập trình mạng với java – Khái niệm Socket
Một socket là một trong những thiết bị đầu cuối của một liên kết giao tiếp hai chiều giữa hai chương trình đang chạy trên mạng.
Một ứng dụng máy chủ (server) chạy trên một máy tính cụ thể và có một socket ràng buộc với một con số cụ thể và được gọi là cổng (port).
Trên phía máy khách (client), các ứng dụng máy khách cần phải biết tên máy chủ (server name) mà trên đó các ứng dụng máy chủ đang chạy và cổng mà máy chủ đang lắng nghe để tạo một socket và sử dụng socket này để thực hiện kết nối với máy chủ.
Khái niệm cổng (port)
Cổng là địa chỉ của ứng dụng và được đánh số từ 0 đến 65535 (Các cổng từ 0 đến 1023 đã được sử dụng. Ví dụ cổng 80 sử dụng trong các ứng dụng web, 21 sử dụng trong ứng dụng gửi nhận file – FTP, … và khi chỉ định cổng chúng ta phải không được phép sử dụng các cổng trong phạm vi này)
Lập trình mạng với java – Sử dụng giao thức TCP
TCP cung cấp một kênh kết nối cho các ứng dụng cần kết nối đáng tin cậy (reliable connections) như HTTP, FTP, … Đối với giao thức này điều kiện tiên quyết là phải thiết lập một kết nối trước khi thực hiện các xử lý tiếp theo.
Xử lý phía server (máy chủ)
Bước 1: Tạo Server socket
//Server socket ServerSocket ss = new ServerSocket(portNumber); //Client socket Socket cs = ss.accept();
Bước 2: Tạo đối tượng nhận dữ liệu từ client
InputStream is = cs.getInputStream(); Scanner s = new Scanner(is);
Bước 3: Tạo đối tượng gửi dữ liệu cho client
OutputStream os = cs.getOutputStream(); PrintWriter pw = new PrintWriter(os, true);
Bước 4: Xử lý nhận và gửi dữ liệu
//Nhận dữ liệu từ client String strReceive = s.nextLine(); //Gửi dữ liệu cho client pw.println(Dữ liệu gửi cho client);
Xử lý phía client (máy khách)
Bước 1: Tạo Client socket
Socket cs = new Socket(serverName, portNumber);
Bước 2: Tạo đối tượng nhận dữ liệu từ server
InputStream is = cs.getInputStream(); Scanner s = new Scanner(is);
Bước 3: Tạo đối tượng gửi dữ liệu cho server
OutputStream os = cs.getOutputStream(); PrintWriter ps = new PrintWriter(os, true);
Bước 4: Xử lý nhận và gửi dữ liệu
//Nhận dữ liệu từ server String strReceive = s.nextLine(); //Gửi dữ liệu cho server pw.println(Dữ liệu gửi cho server);
Lập trình mạng với java – Chương trình mẫu sử dụng giao thức TCP
Phía server
package swing_pkg.networking; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * * @author giasutinhoc.vn */ public class ServerSide { public static void main(String[] args) { try { //Tạo ServerSocket ServerSocket server = new ServerSocket(5252); //Khai báo Socket đại diện cho kết nối của cs với server Socket cs; while (true) { //Lắng nghe kết nối từ cs cs = server.accept(); //Tạo đối tượng dùng để nhận dữ liệu gửi về từ cs InputStream is = cs.getInputStream(); Scanner s = new Scanner(is); //Tạo đối tượng dùng để gửi dữ liệu cho cs OutputStream os = cs.getOutputStream(); PrintWriter pw = new PrintWriter(os, true); //Xử lý nhận và gửi dữ liệu while (s.hasNextLine()) { //Nhận dữ liệu từ cs String strReceive = s.nextLine(); //Hiển thị dữ liệu System.out.println("Receive from client: " + strReceive); //Gửi dữ liệu cho cs pw.println("Server side send data..."); } } } catch (Exception ex) { ex.printStackTrace(); } } }
Phía client
package swing_pkg.networking; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; /** * * @author giasutinhoc.vn */ public class ClientSide { public static void main(String[] args) { try { //Tạo đối tượng Socket đại diện cho cs Socket cs = new Socket("localhost", 5252); //Tạo đối tượng dùng để nhận dữ liệu từ server InputStream is = cs.getInputStream(); Scanner s = new Scanner(is); //Tạo đối tượng dùng để gửi dữ liệu đến server OutputStream os = cs.getOutputStream(); PrintWriter ps = new PrintWriter(os, true); //Gửi dữ liệu đến server ps.println("Client slide send data..."); //Nhận dữ liệu từ server String strReceive = s.nextLine(); System.out.println("Receive from server: " + strReceive); } catch (Exception ex) { ex.printStackTrace(); } } }
Lập trình mạng với java – Bài tập thực hành
Câu 1: Thiết kế giao diện
Câu 2: Viết xử lý
- Phía server: Khi người dùng chọn nút “Start”, thực hiện mở và lắng nghe kết nối từ client; tạo đối tượng nhận và gửi dữ liệu.
- Phía client: Khi người dùng chọn nút “Connect”, thực hiện kết nối đến server, tạo đối tượng nhận và gửi dữ liệu.
- Khi người dùng chọn nút “Send”, thực hiện gửi 2 số mà người dùng đã nhập cho server và nhận kết quả trả về là tổng của 2 số từ server.
- Khi người dùng chọn nút lệnh “Exit”, kết thúc chương trình.