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

标签 java mysql sockets client-server serversocket

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

客户端代码:

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");
        }
    }}}

最佳答案

这是你想要的片段:

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();
        }
    .....

请注意,这只是一个片段,并不是适当的优化代码。除此之外,还有很多可以在您发布的代码中完成的改进,例如在线程创建逻辑上保持阈值等。但我跳过了这一点,因为您的问题仅与从 Server 程序中的控制台获取输入有关.

关于java - 如何从客户端服务器程序中的服务器控制台获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35374599/

相关文章:

java - 使用java应用程序发送电子邮件

java - 为什么RxJava2不支持 "Maybe.doOnDispose"?

java - 我是否需要继续命令。为什么?

javascript - 在 JQuery 和执行函数中使用的 JSON 数组值

mysqldump 转 utf8 格式的 csv

java - 简单的服务器/客户端套接字连接?

java - 仅在 Linux 上运行 JUnit 测试

php - 根据PHP变量中值的数量多次执行mysql查询

javascript - 如何创建可重用的 Socket.IO 模块

可以访问网站但不能访问子目录中的文本文件