2013-10-07 5 views
11

У меня есть два проекта Java-netbeans, один из которых является другим сервером. У меня есть класс сообщений, который я создал, который я хочу передать на сервер, и обратный путь к клиенту после изменения, сделанного на сервере. Я включил класс Message в оба проекта. Я использую ObjectOutputStream и ObjectInputStream, чтобы передать объект. Соединение между сервером и клиентом в порядке, и объект проходит через, но на сервере, когда я читаю объект из ObjectInputStream с использованием метода readObject(), который я набираю, введите его в класс Message. Но на сервере выбрано ClassNotFoundException. Он не может найти класс Message. Как я могу это решить?Отправка объекта через сокет в java

Код для клиента:

public void startClient() { 
    try { 
     // Create the socket 
     Socket clientSocket = new Socket(HOST, PORT); 
     // Create the input & output streams to the server 
     ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream()); 
     ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream()); 

     // Read modify 
     // TODO here 

     /* Create The Message Object to send */ 
     LinkedList<Message> msgList = new LinkedList<>(); 
     Message msg = new Message(); 
     msg.setMessage("Kasun"); 
     msg.setIndex(1); 
     msg.setAverage(5.5f); 
     msgList.push(msg); 

     /* Send the Message Object to the server */ 
     outToServer.writeObject(msgList);    

     /* Retrive the Message Object from server */ 
     LinkedList<Message> inFromServerList = new LinkedList<>(); 
     Message msgFrmServer = null; 
     inFromServerList = (LinkedList<Message>)inFromServer.readObject(); 
     msgFrmServer = inFromServerList.pop(); 

     /* Print out the recived Message */ 
     System.out.println("Message: " + msgFrmServer.getMessage()); 
     System.out.println("Index: " + msgFrmServer.getIndex()); 
     System.out.println("Average: " + msgFrmServer.getAverage()); 


     clientSocket.close(); 

    } catch (Exception e) { 
     System.err.println("Client Error: " + e.getMessage()); 
     System.err.println("Localized: " + e.getLocalizedMessage()); 
     System.err.println("Stack Trace: " + e.getStackTrace()); 
    } 
} 

Код для сервера

public void startServer() { 

    try { 
     ServerSocket welcomeSocket = new ServerSocket(PORT); 

     while (true) {  
      // Create the Client Socket 
      Socket clientSocket = welcomeSocket.accept(); 
      System.out.println("Socket Extablished..."); 
      // Create input and output streams to client 
      ObjectOutputStream outToClient = new ObjectOutputStream(clientSocket.getOutputStream()); 
      ObjectInputStream inFromClient = new ObjectInputStream(clientSocket.getInputStream()); 

      // Read modify 
      // TODO here 

      /* Create Message object and retrive information */ 
      LinkedList<Message> inList = new LinkedList<>(); 
      Message inMsg = null; 
      inList = (LinkedList<Message>)inFromClient.readObject(); 
      inMsg = inList.pop(); 

      /* Modify the message object */ 
      inMsg.setMessage(inMsg.getMessage().toUpperCase()); 
      inMsg.setIndex(5); 
      inMsg.setAverage(10.5f); 

      /* Send the modified Message object back */ 
      outToClient.writeObject(inMsg);   

     } 

    } catch (Exception e) { 
     System.err.println("Server Error: " + e.getMessage()); 
     System.err.println("Localized: " + e.getLocalizedMessage()); 
     System.err.println("Stack Trace: " + e.getStackTrace()); 
     System.err.println("To String: " + e.toString()); 
    } 
} 

за исключением выброшен на "сервере"

java.lang.ClassNotFoundException: rusl.online.examination.system.client.utility.Message 

ли я использовать Java RMI? Есть ли решение для этого без использования RMI?

+0

Как вы * не используете * RMI, это не подходящий тег для этого вопроса. – EJP

ответ

7

Убедитесь, что сообщение на стороне сервера rusl.online.examination.system.client.utility.Message. Кажется, это не так.

+0

Он работал, :) и нашел еще одну ошибку в этом процессе. Я попробовал такой же метод, прежде чем я разместил здесь вопрос. но, как ни странно, это не работало .. он работал на этот раз .. Большое спасибо :) –

1

Если вы отправляете объекты класса через сокет. Чтобы воспроизвести объект на другом конце, вам нужно отбросить объект. Для этого вам потребуется определение класса на обоих концах.

Убедитесь, что вы правильно импортировали тот же класс Message для серверной программы, который вы использовали для создания сообщения.

+0

Определение класса требуется до сдачи. Это необходимо для десериализации самого объекта. – EJP

+0

Решено бросить, спасибо за вашу помощь :) –

Смежные вопросы