密码身份验证套接字编程

时间:2017-05-01 10:30:21

标签: java sockets authentication

我有3个类(客户端,服务器和协议),允许用户登录并向另一个用户发送消息。我试图在程序中添加密码功能,但到目前为止我还没有尝试过。我已在下面添加了我的代码,我想在用户名的错误检查完成后提示用户输入密码。应该比较密码并检查它是否匹配,然后用户才能查看其消息并发送消息。

非常感谢任何提示,谢谢!

Client.java

import java.io.*;
import java.net.*;

public class Client {

    public static void main(String[] args) {

    String messages = "";

    // Makes sure there are only two arguments entered

        if(args.length != 2) {
            System.err.println("Usage: java Client <host name> <port number>");
            System.exit(1);
        }

        // Stores the command line arguments for readability further in the program
        String host = args[0];
        int port = Integer.parseInt(args[1]);

        try (

            // Creates the socket to be used
            Socket s = new Socket(host, port);

            // Reader and Writer to talk with Server
            PrintWriter pw =
                        new PrintWriter(s.getOutputStream(), true);
            BufferedReader bf = new BufferedReader(
                        new InputStreamReader(s.getInputStream()));
        ) {

            // Reader to read from standard input (keyboard)
            BufferedReader keyboard =
                        new BufferedReader(new InputStreamReader(System.in));


        // User interface
        while (true) {

            System.out.println("Please enter your username: ");
            String username = keyboard.readLine();

            // Check that the login is valid
            if (username == null) {
                System.out.println("No username entered");
            }
            else if (username.contains(" ")) {
                System.out.println("Username cannot contain spaces");
            }
                // Send username to server and return number of messages
            else {
                pw.println(username);
                messages = bf.readLine();
                System.out.println("You have " + Integer.parseInt(messages) + " messages");
                break;
            }
        }

        // Enable the user to continue reading and composing messages until
        // they choose to exit
        while (true) {
            System.out.println("Would you like to READ, COMPOSE or EXIT?");
            String choice = keyboard.readLine();

        // Shows the messages left for the user
            if (choice.equals("READ")) {
                pw.println("READ");
                messages = bf.readLine();
                if (messages == "0") {
                    System.out.println("NO MESSAGES");
                }
                else {
                    String incoming = bf.readLine();
                    System.out.println(incoming);
                    incoming = bf.readLine();
                    System.out.println(incoming);
                }
            }
        // Allows user to write a message to another user
            else if (choice.equals("COMPOSE")) {
                pw.println("COMPOSE");
                System.out.println("Enter message recipient");
                String recipient = keyboard.readLine();
                if (recipient == null) {
                    System.out.println("No recipient username entered");
                }
                else if (recipient.contains(" ")) {
                    System.out.println("Recipient username cannot contain spaces");
                }
                else {
                    pw.println(recipient);
                    System.out.println("Enter message to be sent");
                    String im = keyboard.readLine();
                    pw.println(im);
                    System.out.println(bf.readLine());
                }
            }
            else if (choice.equals("EXIT")) {
                pw.println("EXIT");
                System.exit(1);
            }
            else {
                    System.out.println("Error: you must either READ, COMPOSE or EXIT");
            }
        }

        }    


        // Catches the exception in which the server cannot be found
        catch(IOException e) {

            System.out.println("Error, could not connect to Server");
            System.exit(1);
        }
    }
}

Server.java

import java.io.*;
import java.net.*;

public class Server {

    public static void main(String[] args) {

    String request;

        // Makes sure that the user has specified the correct number of command line arguments
        if(args.length != 1) {
            System.err.println("Usage: java Server <port number>");
            System.exit(1);
        }
        int port = Integer.parseInt(args[0]);

        try (
        // Creates a server socket and waits for a connection
            ServerSocket ss = new ServerSocket(port);

            // A socket to communicate with the client
            Socket cs = ss.accept();

            // Reader and Writer to talk with Client
            PrintWriter pw =
                        new PrintWriter(cs.getOutputStream(), true);
            BufferedReader bf = new BufferedReader(
                        new InputStreamReader(cs.getInputStream()));
        )

            // Links the server to the protocol     
        {
            Protocol protocol = new Protocol();
            protocol.storeUsername(bf.readLine());
            pw.println(protocol.messagesNumber());

        // Loop through user input until EXIT is entered
            while (true) {
                request = bf.readLine();
                // Controls output if user inputs READ
                if (request.equals("READ")) {
                    pw.println(protocol.messagesNumber());
                    pw.println(protocol.readSender());
                    pw.println(protocol.readMessage());
                }
                // Controls input if user inputs COMPOSE
                else if (request.equals("COMPOSE")) {
                    String sender = bf.readLine();
                    String message = bf.readLine();
                    if (protocol.append(sender, message)) {
                        pw.println("MESSAGE SENT");
                    }
                    else {
                        pw.println("MESSAGE FAILED");
                    }
                }
                // Exits the server
                else {
                    System.exit(1);
                }
            }
        }


        // Catches the exception in which the server cannot find a client
        catch(IOException e) {
            System.out.println("Failed to find a client");
            System.exit(1);
        }       
    }
}

Protocol.java

import java.net.*;
import java.io.*;
import java.util.*;

public class Protocol {
    private String username;
    private String recipient;
    private String sender;
    private HashMap<String, ArrayList<String>> senderMap = new HashMap<String, ArrayList<String>>();
    private HashMap<String, ArrayList<String>> messageMap = new HashMap<String, ArrayList<String>>();


    // Stores the username for the logged in user
    public void storeUsername(String user) {
        username = user;
    }

    // Stores the recipient name
    public void storeRecipient(String name) {
        recipient = name;
    }

    // Returns how many messages the logged in user has
    public int messagesNumber() {
        if(messageMap.containsKey(username))
            return messageMap.get(username).size();
        else
            return 0;
    }

    public boolean append(String recipient, String message) {
        boolean success = false;
        // If there is an entry for that name, just add the message to the end
        if(messageMap.containsKey(recipient)) {
            senderMap.get(recipient).add(username);
            messageMap.get(recipient).add(message);
            success = true;
        }
        // If there is no entry for that name, create a new entry with a list of messages and add the first message
        else {
            senderMap.put(recipient, new ArrayList<String>());
            senderMap.get(recipient).add(username);
            messageMap.put(recipient, new ArrayList<String>());
            messageMap.get(recipient).add(message);
            success = true;
        }
        return success;             
    }

     public String readSender() {

        // If the user has an entry and has at least 1 sender, return the least recent sender and then remove it  (the sender first in the list)
        if(senderMap.containsKey(username)) {
            if(senderMap.get(username).size() > 0) {
                String temp = senderMap.get(username).get(0);
                senderMap.get(username).remove(0);
                return temp;
            }
            else
                // If there are no messages left to read
                return "NO MESSAGES";
        }
        else
            // If the login hasn't been created yet
            return "NO MESSAGES";
    }


    public String readMessage() {

    // If the user has an entry and has at least 1 unread message, return the least recent unread message and then remove it (the first  message in the list)
        if(messageMap.containsKey(username)) {
            if(messageMap.get(username).size() > 0) {
                String temp = messageMap.get(username).get(0);
                messageMap.get(username).remove(0);
                return temp;
            }
            else
                // If there are no messages left to read
                return "NO MESSAGES";
            }
        else 
            // If the login hasn't been created yet
            return "NO MESSAGES";
    }
}

0 个答案:

没有答案