Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向客户机/服务器发送对象/从客户机/服务器发送对象_Java_Client Server_Classcastexception_Objectinputstream_Objectoutputstream - Fatal编程技术网

Java 向客户机/服务器发送对象/从客户机/服务器发送对象

Java 向客户机/服务器发送对象/从客户机/服务器发送对象,java,client-server,classcastexception,objectinputstream,objectoutputstream,Java,Client Server,Classcastexception,Objectinputstream,Objectoutputstream,我正在寻找解决我在尝试将对象从服务器端发送到客户端时出现的错误的方法 表单中的对象作为类实例将通过单击JButton创建。还将创建一个将对象传输到服务器的客户机类。不会发生错误。但是,当要将新对象发送回客户端时,将抛出一个ClassCastException ActionListener类 class ActionHandler implements ActionListener { String buttonPressed; List<String> parameter

我正在寻找解决我在尝试将对象从服务器端发送到客户端时出现的错误的方法

表单中的对象作为类实例将通过单击JButton创建。还将创建一个将对象传输到服务器的客户机类。不会发生错误。但是,当要将新对象发送回客户端时,将抛出一个ClassCastException

ActionListener类

class ActionHandler implements ActionListener {
   String buttonPressed;
   List<String> parameterList = new ArrayList<String>();

   public void actionPerformed(ActionEvent event) {
      if(event.getSource() == executeNameSearch) {
         buttonPressed = "NameSearch";
         parameterList = new ArrayList<String>();
         parameterList.add(pizzaNameSearch.getText());
         ObjectToServer object = new ObjectToServer(buttonPressed, parameterList);

         // build connection to server
         Client client = new Client();
         client.connectToServer(object);
      }
      else if(event.getSource() == executeNameSearch) {
         buttonPressed = "IDSuche";
         parameterList = new ArrayList<String>();
         parameterList.add(pizzaIDSearch.getText());
         ObjectToServer object = new ObjectToServer(buttonPressed, parameterList);

         Client client = new Client();
         client.connectToServer(object);
      }
      // some more actionPerformed cases..
   }
}
public class Client {
   public void connectToServer(ObjectToServer object) {
      Socket server = null;
      try {
         server = new Socket("localhost", 3141);
         ObjectOutputStream oos = new ObjectOutputStream(server.getOutputStream());
         ObjectInputStream ois = new ObjectInputStream(server.getInputStream());

         // sending object to server
         oos.writeObject(object);
         oos.flush();

         // receiving object from server
         try {
            // ERROR BY TRYING TO CAST HERE
            ObjectToClient objectIn = (ObjectToClient) ois.readObject();
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         }

         oos.close();
         ois.close();
      } catch(UnknownHostException e) {
         e.printStackTrace();
      } catch(IOException e) {
         e.printStackTrace();
      } finally {
         if(server!=null) {
            try {
               server.close();
            } catch(IOException e) {
               System.out.println(e);
            }
         }
      }
   }
}
public class Server {
   static PizzaManager manager = new PizzaManager();
   private static void handleConnection(Socket client) throws IOException {
      ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
      ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

      ObjectToServer objectIn;
         try {
            objectIn = (ObjectToServer) ois.readObject();
            String buttonPressed = objectIn.getButtonPressed();

            if(buttonPressed.equals("NamenSuche")) {
               String searchedPizzaName = objectIn.getParameterList().get(0);
               manager.namenSuche(searchedPizzaName);

               ObjectToClient objectOut = new ObjectToClient();
               objectOut.setResults(manager.getResults());
               oos.writeObject(objectIn);
            }
            // some more cases..
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         }

         ois.close();
         oos.close();
   }

   public static void main(String[] args) throws IOException {
      ServerSocket server = new ServerSocket(3141);
      while(true) {
         Socket client = null;
         try {
            client = server.accept();
            handleConnection(client);
         }
         catch(IOException e) {
            e.printStackTrace();
         }
         finally {
            if(client!=null) {
                try {
                    client.close();
                }
                catch(IOException e) {
                }
            }
        }
      }
   }
}
服务器类

class ActionHandler implements ActionListener {
   String buttonPressed;
   List<String> parameterList = new ArrayList<String>();

   public void actionPerformed(ActionEvent event) {
      if(event.getSource() == executeNameSearch) {
         buttonPressed = "NameSearch";
         parameterList = new ArrayList<String>();
         parameterList.add(pizzaNameSearch.getText());
         ObjectToServer object = new ObjectToServer(buttonPressed, parameterList);

         // build connection to server
         Client client = new Client();
         client.connectToServer(object);
      }
      else if(event.getSource() == executeNameSearch) {
         buttonPressed = "IDSuche";
         parameterList = new ArrayList<String>();
         parameterList.add(pizzaIDSearch.getText());
         ObjectToServer object = new ObjectToServer(buttonPressed, parameterList);

         Client client = new Client();
         client.connectToServer(object);
      }
      // some more actionPerformed cases..
   }
}
public class Client {
   public void connectToServer(ObjectToServer object) {
      Socket server = null;
      try {
         server = new Socket("localhost", 3141);
         ObjectOutputStream oos = new ObjectOutputStream(server.getOutputStream());
         ObjectInputStream ois = new ObjectInputStream(server.getInputStream());

         // sending object to server
         oos.writeObject(object);
         oos.flush();

         // receiving object from server
         try {
            // ERROR BY TRYING TO CAST HERE
            ObjectToClient objectIn = (ObjectToClient) ois.readObject();
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         }

         oos.close();
         ois.close();
      } catch(UnknownHostException e) {
         e.printStackTrace();
      } catch(IOException e) {
         e.printStackTrace();
      } finally {
         if(server!=null) {
            try {
               server.close();
            } catch(IOException e) {
               System.out.println(e);
            }
         }
      }
   }
}
public class Server {
   static PizzaManager manager = new PizzaManager();
   private static void handleConnection(Socket client) throws IOException {
      ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
      ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

      ObjectToServer objectIn;
         try {
            objectIn = (ObjectToServer) ois.readObject();
            String buttonPressed = objectIn.getButtonPressed();

            if(buttonPressed.equals("NamenSuche")) {
               String searchedPizzaName = objectIn.getParameterList().get(0);
               manager.namenSuche(searchedPizzaName);

               ObjectToClient objectOut = new ObjectToClient();
               objectOut.setResults(manager.getResults());
               oos.writeObject(objectIn);
            }
            // some more cases..
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         }

         ois.close();
         oos.close();
   }

   public static void main(String[] args) throws IOException {
      ServerSocket server = new ServerSocket(3141);
      while(true) {
         Socket client = null;
         try {
            client = server.accept();
            handleConnection(client);
         }
         catch(IOException e) {
            e.printStackTrace();
         }
         finally {
            if(client!=null) {
                try {
                    client.close();
                }
                catch(IOException e) {
                }
            }
        }
      }
   }
}
StackTrace

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
transfer.ObjectToServer cannot be cast to server.ObjectToClient
at client.Client.connectToServer(Client.java:34)
at gui.Pizzasuche$ActionHandler.actionPerformed(Pizzasuche.java:362)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

谢谢你的帮助

我认为在您的
服务器
类中,您试图发回错误的对象。
难道不是:

oos.writeObject(objectOut);
?

现在您正在发回objectIn,它是一个
ObjectToServer
实例(或者至少是这样铸造的),而您正试图将其铸造为
ObjectToClient
客户端,因此出现了ClassCastException

固定服务器类:

public class Server {
   static PizzaManager manager = new PizzaManager();
   private static void handleConnection(Socket client) throws IOException {
      ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
      ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

      ObjectToServer objectIn;
         try {
            objectIn = (ObjectToServer) ois.readObject();
            String buttonPressed = objectIn.getButtonPressed();

            if(buttonPressed.equals("NamenSuche")) {
               String searchedPizzaName = objectIn.getParameterList().get(0);
               manager.namenSuche(searchedPizzaName);

               ObjectToClient objectOut = new ObjectToClient();
               objectOut.setResults(manager.getResults());
               oos.writeObject(objectOut); // instead of objectIn
            }
            // some more cases..
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         }

         ois.close();
         oos.close();
   }

   public static void main(String[] args) throws IOException {
      ServerSocket server = new ServerSocket(3141);
      while(true) {
         Socket client = null;
         try {
            client = server.accept();
            handleConnection(client);
         }
         catch(IOException e) {
            e.printStackTrace();
         }
         finally {
            if(client!=null) {
                try {
                    client.close();
                }
                catch(IOException e) {
                }
            }
        }
      }
   }
}

显然,预期的对象不是实际发送的对象。你有一个逻辑错误。您没有正确实现自己的应用程序协议。