如何从客户端服务器程序中的服务器控制台获取输入

时间:2016-02-13 00:37:56

标签: java mysql sockets client-server serversocket

我使用java(多线程)实现了一个客户界面。在客户端,客户在服务器已运行时登录。多个客户端可以登录为每个客户端创建一个线程。我想要实现的是当多个客户端登录时我想在服务器控制台(eclipse)中输入一个命令,该命令列出了我在控制台上输入内容后登录的所有客户端。

代码的ClientSide:

btnLogin.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                Connection conn = null;
                try // try block
                {
                    // declare variables
                    String username = "";
                    String pwd = "";

                    // get values using getText() method
                    username = loginEmail.getText().trim();
                    pwd = new String(loginPassword.getPassword());

                    // check condition it field equals to blank throw error
                    // message
                    if (username.equals("") || pwd.equals("")) {
                        JOptionPane.showMessageDialog(null, " name or password or Role is wrong", "Error",
                                JOptionPane.ERROR_MESSAGE);
                    } else // else insert query is run properly
                    {
                        String IQuery = "select accountnumber, customername, address from `customeraccount` where emailaddress=? and password=?";
                        String accnum = null;
                        System.out.println("Connecting to a selected database...");

                        // STEP 3: Open a connection
                        conn = DriverManager.getConnection(DB_URL, user_name, password);
                        System.out.println("Connected database successfully...");
                        PreparedStatement stmt = conn.prepareStatement(IQuery);
                        stmt.setString(1, username);
                        stmt.setString(2, pwd);
                        ResultSet rs = stmt.executeQuery();
                        while (rs.next()) {
                            detailName.setText(rs.getString("customername"));
                            detailAddress.setText(rs.getString("address"));
                            accnum = rs.getString("accountnumber");
                        }
                        out.println(accnum);
                        out.println(detailName.getText());
                        rs.close();
                        ((java.sql.Connection) conn).close();
                    }
                } catch (SQLException se) {
                    // handle errors for JDBC

                    se.printStackTrace();
                } catch (Exception a) // catch block
                {
                    a.printStackTrace();
                }
            }
        });

代码的服务器端:

public class StoreServer {
static ArrayList<String[]> list2 = new ArrayList<String[]>();

public static void main(String[] args) throws IOException {
    System.out.println("The server is running.");
    int clientNumber = 0;
    ServerSocket listener = new ServerSocket(3355);

    try {
        while (true) {
            new Thread(new Customer(listener.accept(), clientNumber++)).start();
        }
    } finally {
        listener.close();
    }
}

private static class Customer implements Runnable {
    private Socket socket;
    private int clientNumber;

    public Customer(Socket socket, int clientNumber) {
        this.socket = socket;
        this.clientNumber = clientNumber;
        // log("New connection with client# " + clientNumber + " at " +
        // socket);
    }

    /**
     * Services this thread's client by first sending the client a welcome
     * message then repeatedly reading strings and sending back the
     * capitalized version of the string.
     */
    public void run() {
        try {

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);


            while (true) {

                    System.out.println("Account Number: " + acnum + "  Name: " + name);
                if (acnum == null || acnum.equals(".")) {
                    break;
                }
                // out.println(input.toUpperCase());
            }
        } catch (IOException e) {
            log("Error handling client# " + clientNumber + ": " + e);
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                log("Couldn't close a socket, what's going on?");
            }
            // log("Connection with client# " + clientNumber + " closed");
        }
    }}}

2 个答案:

答案 0 :(得分:6)

以下是您想要的代码段:

private static class CommandListener implements Runnable {

    @Override
    public void run() {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while(true) {
            try {
                String command = br.readLine();
                if(command.equals("listClients")) {

                    // Assuming you will have static list of customer. In which you will 
                    // add a customer/client when a new client get connected and remove 
                    // when a client get disconnected 

                    System.out.println("Total Connected customer :" + customers.size());
                    System.out.println("Details :");
                    for(Customer cust : customers) {
                        System.out.println(cust.getName());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

StoreServer类中创建CommandListener类的对象,并在侦听服务器端口之前将其传递给线程。像这样:

public class StoreServer {

    static ArrayList<String[]> list2 = new ArrayList<String[]>();
    static List<Customer> customers = new LinkedList<Customer>();

    public static void main(String[] args) throws IOException {
        System.out.println("The server is running.");
        int clientNumber = 0;
        ServerSocket listener = new ServerSocket(3355);
        Thread commandListenerThread = new Thread(new CommandListener());
        commandListenerThread.start();
        try {
            while (true) {
                Socket socket = listener.accept();
                Customer cust = new Customer(socket, clientNumber++);
                customers.add(cust);
                new Thread(cust).start();
            }
        } finally {
            listener.close();
        }
    .....

请注意,这只是一个片段而不是正确且优化的代码。除此之外,还有许多改进可以在你发布的代码中完成,比如在线程创建逻辑上保持一个阈值等等。但是我正在跳过它,因为你的问题只与在{{{}中从控制台获取输入有关。 1}}程序。

答案 1 :(得分:1)

在开始收听传入套接字之前,您应该开始一个新线程。在此线程中,您可以从System.in读取行。 (使用InputStreamReader包装System.in,然后使用BufferedReader)。现在,当您从控制台读取某个命令时,您可以打印出有关已连接客户端的信息。