Viết chương trình java tcp socket chấp nhận kết nối từ các máy khách. Khi kết nối, máy chủ mong đợi máy khách gửi hai số và một toán tử số học, thực hiện phép tính và trả kết quả về cho máy khách.
Xem thêm:
1. Mô tả bài toán
Đề bài: Viết chương trình theo mô hình Client/Server. Client gửi lên Server hai số thực và một trong bốn phép toán: cộng, trừ, nhân, chia. Server xử lý tính toán theo yêu cầu và gửi trả kết quả.
Video hướng dẫn chi tiết:
2. Code tham khảo
2.1 Code phía Server
- Tạo một đối tượng ServerSocket lắng nghe trên cổng 9555.
- Máy chủ bắt đầu một vòng lặp vô hạn để liên tục chấp nhận kết nối từ máy khách.
- Khi chấp nhận kết nối từ một máy khách, nó bắt đầu một luồng mới để xử lý việc giao tiếp với máy khách đó.
- Trong luồng, nó thiết lập luồng đầu vào và đầu ra để giao tiếp với máy khách.
- Nó đọc hai số và một toán tử từ máy khách.
- Nó thực hiện phép tính số học yêu cầu.
- Nếu phép tính là phép chia, nó định dạng kết quả với hai chữ số sau dấu thập phân.
- Nó gửi kết quả trở lại cho máy khách.
public class Server { private final static int SERVER_PORT = 9555; public static void main(String[] args) { try { //Mo cong ServerSocket serverSocket = new ServerSocket(SERVER_PORT); System.out.println("Server dang chay..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("Client Connected!"); new Thread(new Runnable() { @Override public void run() { try { Scanner in = new Scanner(socket.getInputStream()); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); double n1 = in.nextDouble(); double n2 = in.nextDouble(); String operator = in.next(); String result = ""; switch (operator) { case "+": result = n1 + n2 + ""; break; case "-": result = n1 - n2 + ""; break; case "*": result = n1 * n2 + ""; break; case "/": DecimalFormat f = new DecimalFormat("#.##"); result = f.format(n1 / n2) + ""; break; } out.println(result); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } catch (Exception e) { e.printStackTrace(); } } }
2.2 Code phía Client
- Lấy thông tin về máy chủ (host) từ trường văn bản (txtIP).
- Lấy thông tin về cổng (port) từ trường văn bản (txtPort) và chuyển đổi nó sang kiểu số nguyên.
- Lấy hai số (n1 và n2) từ hai trường văn bản (txtNumber1 và txtNumber2) và chuyển đổi chúng sang kiểu số thực (double).
- Lấy phép toán (operator) từ một combobox (jComboBox).
- Tạo một kết nối socket đến máy chủ được xác định bằng host và port.
- Trong một vòng lặp vô hạn, tạo một luồng đầu vào và đầu ra để giao tiếp với máy chủ thông qua socket.
- Gửi n1, n2 và operator đến máy chủ thông qua luồng đầu ra.
- Đọc kết quả trả về từ máy chủ thông qua luồng đầu vào và hiển thị nó trong một trường văn bản (txtResult).
- Đóng kết nối socket sau mỗi vòng lặp.
private void btnResultActionPerformed(java.awt.event.ActionEvent evt) { try { String host = txtIP.getText(); int port = Integer.parseInt(txtPort.getText()); double n1 =Double.parseDouble(txtNumber1.getText()); double n2 =Double.parseDouble(txtNumber2.getText()); String operator = jComboBox.getSelectedItem().toString(); Socket socket = new Socket(host, port); while(true){ Scanner in = new Scanner(socket.getInputStream()); PrintWriter out = new PrintWriter(socket.getOutputStream(),true); out.println(n1); out.println(n2); out.println(operator); txtResult.setText(in.nextLine()); socket.close(); } } catch (Exception e) { } }
Trên đây là chương trình tạo ra một máy chủ cơ bản có thể thực hiện các phép toán số học đơn giản dựa trên yêu cầu của máy khách. Cảm ơn bạn đã tham khảo bài tập lập trình mạng trên ttnguyen.net.
Bài viết liên quan:
chuyển một số sang hệ Hexa-Decimal java socket