Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

Mọi người giúp mình bài về TCP với ạ

Discussion in 'Xây dựng ứng dụng server-client desktop' started by coaichua213, 2/7/16.

  1. coaichua213

    coaichua213 New Member

    Mình đang có bài tập về mảng 2 chiều mxn truyền từ Client sang Server xử lý và trả kết quả tổng từng hàng trong mảng về cho client.
    Mình có code client và server mẫu sau
    Client.java
    Code:
    public class Client {
        private Socket socketServer;
        String server;
        int port;
        private Scanner input,reader;
        private PrintWriter output;
    
        public Client(String server,int port) throws IOException {
            this.server = server;
            this.port = port;
        }
      
        private void run() throws IOException{            
            mainMenu();
        }
    
        private void mainMenu() throws IOException {
            int choosedValue;  // lưu trữ giá trị người dùng lựa chọn chức năng
          
            do {        
                // Kết nối tới socket của server
                socketServer = new Socket(server, port);
                      
                //Đọc dữ liệu do người dùng nhập vào từ bàn phím
                reader = new Scanner(System.in);
              
                System.out.println("[1] - NHẬP DỮ LIỆU TỪ BÀN PHÍM");
                System.out.println("[2] - NHẬP DỮ LIỆU TỪ FILE data.txt");
                System.out.println("[3] - KẾT THÚC");
                System.out.print("Bạn chọn: ");
                //Đọc tùy chọn của người dùng
                choosedValue = reader.nextInt();
                // Xóa bộ đệm
                reader.nextLine();
                // Lấy thông tin luồng nhận từ phía socket của server
                // nhằm nhận kết quả đã xử lý trả về từ phía server
                input = new Scanner(socketServer.getInputStream());
                // Gởi yêu cầu lên nhờ server xử lý
                output = new PrintWriter(socketServer.getOutputStream(),true);
              
                String userData = "";
                          
                if (choosedValue == 2) {
                   reader = new Scanner(new BufferedReader(new FileReader("data.txt")));             
                }
              
                while (choosedValue !=3) {
                    if (choosedValue == 1) {  // đọc dữ liệu từ bàn phím
                        System.out.print("Mời bạn nhập dữ liệu: ");
                        userData = reader.nextLine(); // đọc một dòng
                        output.println(userData); // gởi yêu cầu lên server [1;50]
                        if (!userData.equalsIgnoreCase("ket thuc")) {
                            System.out.println("KẾT QUẢ: " + input.nextLine());
                        }else{
                            break;  // Thoát khỏi vòng lặp while (choosedValue !=3)
                        }
                    }
                  
                    if (choosedValue ==2) {
                        while (reader.hasNext()) {
                            userData = reader.nextLine();
                            output.println(userData);
                              
                            if (!userData.equalsIgnoreCase("ket thuc")) {
                                System.out.println("KẾT QUẢ: " + input.nextLine());
                            }
                        }
                      
                        if (userData.equalsIgnoreCase("ket thuc")) {
                            break;
                        }
                    }              
                }
            } while (choosedValue !=3);
        }
      
        public static void main(String[] args) throws IOException {
            Client client = new Client("localhost", 9090);
            client.run();
        }
      
    }
    
    Server.java
    Code:
    public class Server {
        private ServerSocket listener;  // lắng nghe các yêu cầu từ phía client
        private Socket clientSocket;  // thông tin socket của client (gởi trả kết quả)
        private Scanner inputReader; // input stream
        private PrintWriter outputWriter;  // output stream
    
        public Server(int port) throws IOException {
            listener = new ServerSocket(port);
        }
      
        private void runServices() throws IOException{
            while (true) {          
                System.out.println("Waiting for client on port " +
                        listener.getLocalPort() + " ...");
                clientSocket = listener.accept(); // chấp nhận và ghi nhớ thông tin socket của client
                System.out.println(".....");
                // luồng đọc yêu cầu từ phía client
                inputReader = new Scanner(clientSocket.getInputStream());                      
                // luồng gởi trả kết quả sau khi đã xử lý yêu cầu, đối số thứ hai là true
                // nhằm thiết lập tính năng auto flush
                outputWriter = new PrintWriter(clientSocket.getOutputStream(),true);
    
                String inputData,outputData;   
                while (!(inputData=inputReader.nextLine()).trim().equalsIgnoreCase("ket thuc")) {                             
                    System.out.println("Du lieu nhan duoc: " + inputData);  // yêu cầu nằm trong inputData
                    outputData = process(inputData);  // xử lý yêu cầu
                    // outputData chứa dữ liệu đã xử lý chờ gởi về client
                    outputWriter.println(outputData); // gởi kết quả về cho client             
                }
                clientSocket.close();
            }
        }
        private String process(String inputData){
            return checkPerfectNumber(Integer.parseInt(inputData));
            // Tự viết hàm xử lý yêu cầu, trả về là chuỗi
            // return yourProcess(inputData);
        }
     
        // private String yourProcess(String inputData){}
        private String checkPerfectNumber(int number){
            double sum = 0;
            for (int i = 1; i < number-1; i++) {
                if (number % i ==0) {
                    sum += i;
                }
            }
            if (number == sum) {
                return number + " là số hoàn hảo.";
            } else {
                return number + " không là số hoàn hảo.";
            }
        }
      
        public static void main(String[] args) throws IOException {
            int port = 9090;
            Server server = new Server(port);
            server.runServices();
        }
    }
    Trong ví dụ là truyền 1 luồng lên cho server
    output = new PrintWriter(socketServer.getOutputStream(),true);
    lên cho server xử lý
    Còn đây là server nhận 1 luồng từ client
    inputReader = new Scanner(clientSocket.getInputStream());
    Nếu như bài tập của mình truyền nhiều tham số như truyền m,n rồi từng số mang[m][n] lên cho server thì phải làm như thế nào ạ
     
    Last edited: 2/7/16
  2. quangbeo216

    quangbeo216 Member

    về mặt lí thuyết thì khi client gửi lên server thì gửi lần lượt gửi đến đâu thì server xử lí đến đó, nếu ở server có hàm đáp lại khi xử lí xong thì tuần tự làm từ đầu đến cuối, server sẽ đáp lại kết quả lần lượt
     
  3. hvcuongit

    hvcuongit New Member

    Ở Client sử dụng 1 flag kèm theo khi kết thúc quá trình gửi các gói tin. Khi nào server nhận được flag này thì mới tiến hành xử lý và gửi kết quả trả về cho client.
     

Chia sẻ trang này

Loading...