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

Làm thế nào để server trả về lịch sử kết nối của client?

Discussion in 'Xây dựng ứng dụng server-client desktop' started by xuho, 31/5/16.

  1. xuho

    xuho New Member

    Lại làm phiền mọi người.
    Em đang làm một bài tập có đề bài như sau:

    Viết chương trình client - server thực hiện các chức năng sau: server hiện tên client kết nối client gửi yêu cầu thoát kết nối, server lưu lại thời điểm kết nối và thoát kết nối của client ra file text. Client kết nối lại, server truyền thông tin thời điểm kết nối và thóat kết nối của client trước đó.

    Đây là code của em
    PHP:
    // file Server

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Calendar;

    /**
    * Viết chương trình client - server thực hiện các chức năng sau: server hiện
    * tên client kết nối client gửi yêu cầu thoát kết nối, server lưu lại thời điểm
    * kết nối và thoát kết nối của client ra file text. Client kết nối lại, server
    * truyền thông tin thời điể, kết nối và thóat kết nốt của client trước đó.
    *
    */

    public class Server {
        private 
    ServerSocket server;
        private final 
    int PORT 1995;

        public 
    void process() {
            try {
                
    server = new ServerSocket(PORT);

                
    Socket socket server.accept();
                
    // lay thoi diem ket noi:
                
    Calendar cal Calendar.getInstance();
                
    String timeConnect cal.get(Calendar.HOUR) + ":"
                        
    cal.get(Calendar.MINUTE) + ":" cal.get(Calendar.SECOND);
                
    // in ra ten client ket noi
                
    String hostName socket.getInetAddress().getHostName();
                
    System.out.println("Client dang ket noi: " hostName);

                
    BufferedReader in = new BufferedReader(new InputStreamReader(
                        
    socket.getInputStream()));
                
    // nhan yeu cau cua client
                
    String request in.readLine();
                if (
    request.equals("quit")) {
                    
    socket.close();
                    
    String timeDis cal.get(Calendar.HOUR) + ":"
                            
    cal.get(Calendar.MINUTE) + ":"
                            
    cal.get(Calendar.SECOND);
                    
    File logFile = new File("log.txt");
                    
    FileWriter fw = new FileWriter(logFile);
                    
    fw.write("Thoi gian ket noi: " timeConnect
                            
    "\nThoi gian huy ket noi: " timeDis);
                    
    fw.close();
                }
                
    // tra ve thoi gian da ket noi va huy ket noi truoc do
                
    File logFile = new File("log.txt");
                
    FileReader fr = new FileReader(logFile);
                
    BufferedReader br = new BufferedReader(fr);
                
    String result "";
                
    String temp;
                while(((
    temp br.readLine()) != null)) {
                    
    result += temp;
                }
                
    br.close();
                
    fr.close();
               
                
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                
    out.write(result);
                
    out.newLine();
                
    out.flush();
            } catch (
    Exception e) {

            }
        }

        public static 
    void main(String[] args) {
            new 
    Server().process();
        }
    }
    PHP:
    // file Client

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;

    import javax.swing.JOptionPane;

    public class 
    Client {
        private 
    Socket client;
        private final 
    int PORT 1995;
        private final 
    String HOST "localhost";

        public 
    void connect() {
            try {
                
    client = new Socket(HOSTPORT);
                
    boolean done false;
                while (!
    done) {
                    
    String request JOptionPane
                            
    .showInputDialog("Nhap vao yeu cau(quit de thoat)");
                    
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                            
    client.getOutputStream()));
                    
    out.write(request);
                    
    out.newLine();
                    
    out.flush();
                    if (
    request.equals("quit")) {
                        
    done true;
                    }
                }
                
    // nhan ve thoi gian ket noi va huy ket noi lan truoc
                
    BufferedReader in = new BufferedReader(new InputStreamReader(
                        
    client.getInputStream()));
                
    String result in.readLine();
                if (!
    result.equals("") && !result.equals(null)) {
                    
    System.out.println(result);
                }
            } catch (
    Exception e) {

            }
        }

        public static 
    void main(String[] args) {
            new 
    Client().connect();
        }
    }
    Ở đây em gỉả sử client truyền lên chuỗi "quit" thì mình đóng kết nối lại và sau đó ghi lại thời gian mà client đã kết nối và hủy kết nối vào file log.txt
    Nhưng có 1 vấn đề đó là khi em chạy thằng Client lên ko hiểu sao lúc nhập chưa nhập chuỗi "quit" mà chương trình đã ngừng lại(em thấy nó chỉ cho nhập đúng 3 lần là tắt, bất kể có phải là "quit" hay không)
    Tiếp nữa là nếu chạy là mà nhập quit luôn thì nó sẽ ghi ra file log.txt với thời điểm kết nối và hủy kết nối giống nhau(mặc dù em đã chờ cho thằng client chạy 1 lúc mới nhập chuỗi "quit".
    Mong mọi người giải thích và giúp em sửa lại với ạ, em xin cám ơn.
     
  2. Joe

    Joe Thành viên VIP

    Draw a logical flow of your "process()" method and see how it ends...then you will see the hidden problem within this method.
    Btw, your design is a single server and that means: It serves ONLY ONE client at a time. Every incoming client must wait until the served client quits, and one of them which has "more luck" gets served -independent on who comes first.
     
    xuho likes this.
  3. xuho

    xuho New Member

    I did it :D
     
  4. Joe

    Joe Thành viên VIP

    And? Because no one replies to you or helps you, I give you 2 hints about Client-Server (CS).
    1) Server must be able to serve multiple clients
    PHP:
       ...
       private 
    void serving(int port) {
                 try {
                        
    server = new ServerSocket(port);
                        while (
    true) (new NewClient(server.accept());
                  } catch (
    Exception ex) {
                        
    ex.printStackTrace();
                  }
         }
         ...
         private class 
    NewClient extends Thread {
               ...
               public 
    void run() {
                   try {
                          ....
    // your codes with a verification of "quit", etc. (see the 2nd hint)
                   
    } catch (Exception ex) {
                      ...
                   } 
    finally {
                         try {
                               ....
    // close every open Stream and Socket
                         
    } catch (Exception c) { }
                   }
               }
           }
           ...
    2) A communication always preconditions a 2-ways dialog
    - Client-Server: Client talks - Server listens
    - Server-Client: Server talks - Client listens
    If one of these 2 aforementioned principles is broken, your CS app is in the toilet and it stinks [-X
     

Chia sẻ trang này

Loading...