gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:22:05 25 4
gpt4 key购买 nike

我已经使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com