JAVA客户端-服务器-从ObjectInputStreamReader读取对象

标签 java server client

我正在尝试进行用户身份验证,我已设法将用户对象发送到服务器并检查服务器上的详细信息,但在将对象发送回客户端以证明登录成功时遇到问题。这是附加的文件,它有点乱,因为我试图用它进行实验:

Client

    public class Requester {
        Socket requestSocket;
        ObjectOutputStream out;
        ObjectInputStream in;
        String message="";
        String message2 = "";

        String login="";
        String password="";

        String ipaddress;
        Scanner stdin;
        Requester(){}
        void run()
        {
            stdin = new Scanner(System.in);
            try{
                //1. creating a socket to connect to the server
                User newUser = new User();
                User receivedUser = new User();

                boolean authenticated = false;

                System.out.println("Please Enter your IP Address");
                ipaddress = stdin.next();
                requestSocket = new Socket(ipaddress, 2004);
                System.out.println("Connected to "+ipaddress+" in port 2004");
                //2. get Input and Output streams
                out = new ObjectOutputStream(requestSocket.getOutputStream());
                out.flush();
                out.reset();
                in = new ObjectInputStream(requestSocket.getInputStream());
                System.out.println("Hello");
                //3: Communicating with the server

                do{
                    try
                    {       
                            message = (String)in.readObject();
                            System.out.println(message);                        

                            System.out.print("Please enter username: ");
                            login = stdin.next();
                            newUser.setName(login);
                            System.out.println(login);

                            System.out.print("Please enter password: ");
                            password = stdin.next();
                            newUser.setPassword(password);
                            System.out.println(password);

                            //in = new ObjectInputStream(requestSocket.getInputStream());
                            sendMessage(newUser);

                            message = (String)in.readObject();
                            receivedUser = (User)in.readObject();
                            //System.out.println(message);
                            //receivedUser = (User)in.readObject();

                            /*if(receivedUser.getAthentication() == true) {
                                System.out.println("CLIENT LOGIN");
                            } else {
                                System.out.println("CLIENT FAILED");
                            }*/
                    }
                    catch(ClassNotFoundException classNot)
                    {
                        System.err.println("data received in unknown format");
                    }
                }while(!message.equals("bye"));
            }
            catch(UnknownHostException unknownHost){
                System.err.println("You are trying to connect to an unknown host!");
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
            finally{
                //4: Closing connection
                try{
                    in.close();
                    out.close();
                    requestSocket.close();
                }
                catch(IOException ioException){
                    ioException.printStackTrace();
                }
            }
        }
        void sendMessage(User newUser)
        {
            try{
                out.writeObject(newUser);
                out.flush();
                //System.out.println("client>" + msg);
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
        public static void main(String args[])
        {
            Requester client = new Requester();
            client.run();
        }
    }

Server

    public class EchoServer {
      static List<User> users = new ArrayList<User>();

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

        User user1 = new User("john", "test1");
        users.add(user1);   
        User user2 = new User("paul", "test2");
        users.add(user2);   
        User user3 = new User("martin", "test3");
        users.add(user3);

        ServerSocket m_ServerSocket = new ServerSocket(2004,10);
        int id = 0;
        while (true) {
          Socket clientSocket = m_ServerSocket.accept();
          ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
          cliThread.start();
        }
      }
    }

    class ClientServiceThread extends Thread {
      Socket clientSocket;
      String message, login;
      int clientID = -1;
      boolean running = true;


      ObjectOutputStream out;
      ObjectInputStream in;

      EchoServer list = new EchoServer();

      ClientServiceThread(Socket s, int i) {
        clientSocket = s;
        clientID = i;
      }

      void sendMessage(String msg)
        {
            try{
                out.writeObject(msg);
                out.flush();
                out.reset();
                System.out.println("client> " + msg);
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }

      void sendUser(User usrObj)
        {
          try {
              out.writeObject(usrObj);
              out.flush();
              out.reset();
              System.out.println("clent> " + "User Object Received");
          } 
          catch(IOException ioException) {
              ioException.printStackTrace();
          }
        }

      public void run() {
        User newUser = new User();
        User userAuthen = new User();

        boolean userAuthenticated = false;

        System.out.println("Accepted Client : ID - " + clientID + " : Address - "
            + clientSocket.getInetAddress().getHostName());
        try 
        {
            out = new ObjectOutputStream(clientSocket.getOutputStream());
            out.flush();
            out.reset();
            in = new ObjectInputStream(clientSocket.getInputStream());
            System.out.println("Accepted Client : ID - " + clientID + " : Address - "
                    + clientSocket.getInetAddress().getHostName());

            sendMessage("Connection successful\n");
            do{
                try
                {               
                    //message = (String)in.readObject();
                    //System.out.println("client>"+clientID+"  "+ message);
                    //if (message.equals("bye"))
                    newUser = (User)in.readObject();

                    for(User userObj : list.users) {
                        if(userObj.getName().equals(newUser.getName())) {
                            userAuthenticated = true;
                            userAuthen.setAthentication(userAuthenticated);
                        }
                    }

                    /*if(userAuthenticated == false) {
                        sendMessage("Login Incorrect!");
                        sendMessage("FALSE");
                    }*/ 
                    if(userAuthenticated == true) {
                        sendMessage("Login Correct\n");
                        sendMessage("TRUE");

                        sendUser(userAuthen);
                    }
                    if(userAuthenticated == false) {
                        sendMessage("Login Failed\n");
                        sendMessage("FALSE");
                    }
                }
                catch(ClassNotFoundException classnot){
                    System.err.println("Data received in unknown format");
                }

                //sendMessage("server got the following: "+newUser.getName());
                //sendMessage("server got the following: "+newUser.getPassword());
                userAuthenticated = false;
            }while(running);

            System.out.println("Ending Client : ID - " + clientID + " : Address - "
                    + clientSocket.getInetAddress().getHostName());
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }


    User

    public class User implements Serializable{
        String name = "";
        String password = "";

        boolean userAuthenticated = false;

        User(String name, String password) {
            this.name = name;
            this.password = password;
        }

        User(){}

        public void setName(String name) {
            this.name = name;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public void setAthentication(boolean userAuthenticated) {
            this.userAuthenticated = userAuthenticated;
        }

        public String getName() {
            return name;
        }

        public String getPassword() {
            return password;
        }

        public boolean getAthentication() {
            return userAuthenticated;
        }
    }

最佳答案

您应该得到 ClassCastException,因为您在 User 对象之前发送了 2 个 String 对象,但在 User 对象之前只读取了 1 个 String 对象。

删除行 sendMessage("TRUE"); 就可以了。

PS:您还可以删除 sendMessage("FALSE");

顺便说一句:如果您有一个可序列化的对象,您应该有serialVersionUID,以确保对象版本两侧相同。一旦进行任何更改,您还应该更改版本号。

BR, 兹 Solr 特

关于JAVA客户端-服务器-从ObjectInputStreamReader读取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644659/

相关文章:

java - 在JDK 1.6上开发webservice客户端,需要兼容JDK 1.5.03

java - 如果可以提高可读性,冗余代码是否可以接受?

javascript - 使用 PHP header 将文件保存在本地电脑中

java - 我的基于 Java 的网站是否可供成千上万的用户使用,而我正在编写代码,就像一次只有一个用户访问资源一样?

delphi - Delphi 中客户端和服务器之间交换字符串数据的方法有哪些?

c# - 如何使用c#从服务器读取文本文件并存储在字典中

java - 为什么我的 Selenium JUnit 测试绕过 @Before 和 @After 注释?

java - 根据invent图表中的饼图点击操作创建弹屏

java - 如何显示用于静音原生广告的谷歌表单?

c# - Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端