我正在编写一个使用对象输出和输入流的应用程序。但是我有一个问题,因为我无法正确发送我的对象。我将它写入流,并且服务器给我一个类未找到异常,即使客户端和服务器具有完全相同的此类副本(唯一的区别是包名称)具有相同的序列ID。这是我的班级:
import java.io.Serializable;
public class Message implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String username = null;
private String hashedPassword = null;
private Integer code = null;
private String from = null;
private String to = null;
private Object data = null;
public Message() {
}
public Message(Integer code) {
this.code = code;
}
public Message(Integer code, Object data) {
this.code = code;
this.data = data;
}
public Message(String username, String hashedPassword, Integer code,
String from, String to, Object data) {
this.username = username;
this.hashedPassword = hashedPassword;
this.code = code;
this.from = from;
this.to = to;
this.data = data;
}
public Integer getCode() {
return code;
}
//other getters and setters
}
这是我要发送的对象类。这是客户端代码:
(仅用于测试)
public static void main(String[] args) {
try {
Socket s = new Socket("localhost", 5656);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
Message m = new Message("user3", "123", 100, "2011-06-11 22:22:22",
"2011-06-11 22:22:22", "test");
oos.writeObject(m);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Message n = (Message) ois.readObject();
System.out.print(n.toString());
oos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
这是服务器代码的一部分(是的,它是多线程的):
package systemZarzadzaniaReporterami.serwer;
import java.beans.ExceptionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.SQLException;
public class ClientHandler extends Thread {
private ExceptionListener exceptionListener;
private Socket socket;
private String ip;
public ClientHandler(ExceptionListener exceptionListener, Socket socket) {
this.exceptionListener = exceptionListener;
this.socket = socket;
ip = socket.getInetAddress().getHostAddress();
}
public void run() {
Message in = null;
ObjectInputStream inputStream = null;
ObjectOutputStream outputStream = null;
try {
// ClientListener.CONNECTION_COUNTER++;
inputStream = new ObjectInputStream(socket.getInputStream());
in = (Message) inputStream.readObject();
MessageProcessor messageProcessor = new MessageProcessor();
System.out.print(in.getUsername());
outputStream = new ObjectOutputStream(socket.getOutputStream());
Message out = messageProcessor.process(in, ip);
System.out.print(in.getCode().toString());
outputStream.writeObject(out);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
exceptionListener.exceptionThrown(new ServerException(Codes.ERR_CONNECTION_ERROR));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
exceptionListener.exceptionThrown(new ServerException(Codes.ERR_MYSQL_ERROR));
} finally {
if (inputStream != null)
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
exceptionListener.exceptionThrown(new ServerException(Codes.ERR_CONNECTION_ERROR));
}
if (outputStream != null)
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
exceptionListener.exceptionThrown(new ServerException(Codes.ERR_CONNECTION_ERROR));
}
if (socket != null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
exceptionListener.exceptionThrown(new ServerException(Codes.ERR_CONNECTION_ERROR));
}
// ClientListener.CONNECTION_COUNTER--;
}
}
}
我现在很困惑。因为我不知道为什么会发生这样的事情。
在我看来,当我用字符串替换Message时,以下代码表现最为重要。
答案 0 :(得分:7)
唯一的区别是包名
那不行。类名(包括包名)必须在两侧都相同。
答案 1 :(得分:3)
唯一的区别是包名
然后他们不同一个班级。确保双方完全相同的班级。这意味着相同的包。