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

xuho

New Member
1/5/16
15
1
3
25
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(HOST, PORT);
            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.
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
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.
 
  • Like
Reactions: xuho

xuho

New Member
1/5/16
15
1
3
25
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.
I did it :D
 

Joe

Thành viên VIP
21/1/13
2,963
1,307
113
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