阻止java服务器按顺序发送消息

vlju58qv  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(195)

我有一个简单的服务器,允许客户端注册/登录,然后玩游戏。但是,当有许多客户机连接到服务器时,服务器不会直接向请求的客户机发送消息,而是按顺序(向客户机1、客户机2和客户机3等)发送消息。如何将服务器的消息直接发送到请求的客户端?
这是我的密码:
服务器代码:

// Server class
public class ServerTCP {

    //Vector to store active clients
    static Vector<ClientHandler> ar = new Vector<>();

    //Counter for clients
    static int i = 0;

    public static void main(String[] args) throws IOException {

        System.out.println("SERVER IS ONLINE!");

        //Server is listening on port 1234
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("Waiting for connections...");

        Socket socket;

        while (true) {
            // Accept the incoming request
            socket = serverSocket.accept();

            System.out.println("New connection: " + socket);

            //Obtain input and output streams
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

            System.out.println("Creating a new handler for this client");

            // Create a new handler object for handling this request.
            ClientHandler request = new ClientHandler(socket,"client " + i, dis, dos);

            // Create a new Thread with this object.
            Thread t = new Thread(request);

            System.out.println("Adding this client to active client list");

            // add this client to active clients list
            ar.add(request);

            // start the thread.
            t.start();

            // increment i for new client.
            // i is used for naming only, and can be replaced
            // by any naming scheme
            i++;

        }
    }
}

// ClientHandler class
class ClientHandler implements Runnable {

    Scanner scn = new Scanner(System.in);
    private String name;
    final DataInputStream dis;
    final DataOutputStream dos;
    Socket s;
    boolean isConnected, return_menu;
    HashMap<String, User> usersList = new HashMap<>();
    String username, password;
    User user;

    //Constructor
    public ClientHandler(Socket s, String name, DataInputStream dis, DataOutputStream dos) {
        this.dis = dis;
        this.dos = dos;
        this.name = name;
        this.s = s;
        this.isConnected =true;
    }

    @Override
    public void run() {

        String received = "";
        while (true) {

            try {

                while (received.compareTo("x") !=0) {

                    //Get message from client
                    received = dis.readUTF().trim();
                    System.out.println("Client sent: " + received);

                    //////////////////////////
                    // Login
                    if (received.equals("1")){

                        boolean login_success = false;
                        while (!login_success && !return_menu){
                            for (ClientHandler mc : ServerTCP.ar)
                            {
                                mc.dos.writeUTF("\nLogging in. You can type 'return' in the 'Username' field to return to main menu.");
                                mc.dos.writeUTF("Username: ");
                                username = dis.readUTF().trim();
                                if (username.equals("return")) {
                                    mc.dos.writeUTF("\nReturn to main menu!");
                                    return_menu = true;
                                } else {
                                    User userLogin = usersList.get(username);
                                    mc.dos.writeUTF("Password: ");
                                    password = dis.readUTF().trim();
                                    if (userLogin != null) {
                                        if (!password.equals(userLogin.password)) {
                                            mc.dos.writeUTF("\nWrong username or password! Please try again! Or type 'return' to return to main menu.");
                                        } else {
                                            mc.dos.writeUTF("\nWelcome back, " + userLogin.name + "!");
                                            this.name = username;
                                            login_success = true;
                                        }
                                    } else {
                                        mc.dos.writeUTF("\nWrong username or password! Please try again! Or type 'return' to return to main menu.");
                                    }
                                }
                            }
                        }
                        if (login_success){
                            //Do somethings when logged in 
                        }
                    }

                    //////////////////////////
                    // Register
                    if (received.equals("2")){

                        for (ClientHandler mc : ServerTCP.ar)
                        {
                            mc.dos.writeUTF("\nRegister new account. You can type 'return' to return to main menu.");
                            return_menu = false;
                            boolean register_success = false;
                            while (!register_success && !return_menu) {
                                while (!username_accepted) {
                                    mc.dos.writeUTF("Enter new username: ");
                                    username = dis.readUTF().trim();
                                }
                                while (usersList.containsKey(username)) {
                                    mc.dos.writeUTF("Username already exists, please choose another username. Or type 'return' to return to menu.");
                                    mc.dos.writeUTF("Enter new username: ");
                                    username = dis.readUTF().trim();
                                }
                                if (username.equals("return")) {
                                    mc.dos.writeUTF("\nReturn to main menu!");
                                    return_menu = true;
                                } else {
                                    mc.dos.writeUTF("Enter your password: ");
                                    password = dis.readUTF().trim();
                                    mc.dos.writeUTF("Enter your name: ");
                                    name = dis.readUTF().trim().replaceAll(" +", " ");

                                    user = new User(password,name);

                                    usersList.put(username, user);
                                    mc.dos.writeUTF("Thank you for register, " + name + ". Now you can login!");
                                    register_success = true;
                                }
                            }
                        }
                    }

                    ////////////////////////////
                    // Invalid input
                    if (!(received.equals("1") || received.equals("2"))) {
                        System.out.println("\nInvalid input, please try again!");
                    }
                }

                ////////////////////////////////
                //Exit
                if(received.equals("x")){

                    this.isConnected =false;
                    for (ClientHandler mc : ServerTCP.ar)
                    {
                        mc.dos.writeUTF("Disconnected to server!");
                    }
                    this.s.close();
                    break;

                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        try {
            //Closing input and output streams
            this.dis.close();
            this.dos.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

客户代码:

public class ClientTCP
{
    final static int ServerPort = 1234;

    public static void main(String args[]) throws UnknownHostException, IOException
    {
        Scanner scn = new Scanner(System.in);

        // Getting IP
        String ip = InetAddress.getLocalHost().getHostAddress();

        // Establish the connection
        Socket socket = new Socket(ip, ServerPort);

        System.out.println("Connected to server!");
        System.out.println("Connection info: " + socket);
        System.out.println("INFO: Enter 'x' to exit");
        System.out.println("1. Login\n2. Register\nx. Exit");

        // Obtaining input and out streams
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

        // sendMessage thread
        Thread sendMessage = new Thread(new Runnable()
        {
            @Override
            public void run() {
                while (true) {

                    // read the message to deliver.
                    String msg = scn.nextLine();
                    try {
                        // write on the output stream
                        dos.writeUTF(msg);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        // readMessage thread
        Thread readMessage = new Thread(new Runnable()
        {
            @Override
            public void run() {

                while (true) {
                    try {
                        // read the message sent to this client
                        String msg = dis.readUTF();
                        System.out.println(msg);
                        if (msg.contains("Return to main menu!") || msg.startsWith("Thank you for register")) System.out.println("1. Login\n2. Register\nx. Exit");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        sendMessage.start();
        readMessage.start();

    }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题