在java中通过套接字发送对象
我有两个java netbeans项目,一个是服务器,另一个是客户端。我有一个我创建的消息类,我希望在服务器上完成修改后将其传递给服务器,并以另一种方式返回给客户机。我在两个项目中都包含了类消息。我使用在java中通过套接字发送对象,java,sockets,Java,Sockets,我有两个java netbeans项目,一个是服务器,另一个是客户端。我有一个我创建的消息类,我希望在服务器上完成修改后将其传递给服务器,并以另一种方式返回给客户机。我在两个项目中都包含了类消息。我使用ObjectOutputStream和ObjectInputStream传递对象。服务器和客户端之间的连接正常,但当我使用readObject()方法从ObjectInputStream读取对象时,对象通过服务器,我键入的方法将其强制转换为Message类。但是在服务器上抛出ClassNotFou
ObjectOutputStream
和ObjectInputStream
传递对象。服务器和客户端之间的连接正常,但当我使用readObject()
方法从ObjectInputStream
读取对象时,对象通过服务器,我键入的方法将其强制转换为Message
类。但是在服务器上抛出ClassNotFoundException。它找不到消息类。我如何解决这个问题
客户机代码:
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());
}
}
我必须使用JavaRMI吗?如果通过套接字发送类的对象,是否有不使用RMI的解决方案?。为了在另一端复制对象,必须投射对象。为此,两端都需要类定义
确保为服务器程序正确导入了用于创建消息的相同的
消息类。确保服务器端的消息是rusl.online.examice.system.client.utility.Message
。情况似乎并非如此。在进行强制转换之前,需要先定义类。反序列化对象本身是必需的。他必须正确地导入它,否则它不会编译,所以他不能执行,所以他不可能得到这个异常。答案不正确。它有效,:)并在过程中发现另一个错误。在我把问题贴在这里之前,我尝试了同样的方法。但奇怪的是,它没有;不行。。这次成功了。。非常感谢:)因为您没有使用RMI,所以它不是这个问题的合适标签。
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