Lập trình mạng với java (Bài 6) – Gia Sư Tin Học

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.