我正在尝试编写一个基本的TCP服务器,该服务器从单个客户端发送一个名为Object
的{{1}}。我已经建立了连接并且Person
已发送到服务器。但是,每当我尝试将读取Object
转换回Object
(客户端和服务器存在人员类)时,服务器都会抛出Person
。问题在于以下代码行
ClassNotFoundException
这是服务器类:
Person person = (Person)in.readObject();
以下是客户类:
public class ConnectionTestServer extends Thread {
private ServerSocket server;
private Socket client;
private BufferedReader reader;
@Override
public void run() {
try {
server = new ServerSocket( 25565 );
client = server.accept();
ObjectInputStream in = new ObjectInputStream( client.getInputStream() );
while ( true ){
System.out.println(in.toString());//This was for debug
if(in.readObject() instanceof Person){//and this
System.out.println("Working?");
}
Person person = (Person)in.readObject();//Here is the ClassNotFoundException
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ConnectionTestServer().start();
}
}
最后是人类:
public class ConnectionTestClient {
private static Socket server;
public static void main(String[] args) {
try {
server = new Socket("localhost", 25565);
ObjectOutputStream stream = new ObjectOutputStream( server.getOutputStream() );
stream.writeObject( new Person() );
stream.flush();
server.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
如果有人能帮我解决这个问题,我会很感激。另外,对我(可能)不良编码的一些一般性建议会很好。谢谢!
答案 0 :(得分:0)
我在从TCP反序列化对象之前遇到此问题;
<强>溶液强>
您需要将Person类放在服务器和客户端
中的相同名称包中示例:
服务器强> com.utilities - &gt;该文件夹中的人员类
<强>客户端强> com.utilities - &gt;该文件夹中的人员类
还会生成serialVersionUID
。
答案 1 :(得分:0)
我同意Rod_Algonquin。我想补充一下,针对您的具体问题。
您需要做的事情很少,
Person
对象必须位于同一个包中,并且具有类似的 serialvesrionUID
。 您的服务器代码应如下所示:(观察评论的行,在您的代码中读取对象两次,只发送一次)
public class Server extends Thread {
private ServerSocket server;
private Socket client;
@Override
public void run() {
try {
server = new ServerSocket(25565);
client = server.accept();
while (true) {
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
ObjectInputStream in = new ObjectInputStream(bis);
System.out.println(in.toString());// This was for debug
/*if (in.readObject() instanceof Person) {// and this
System.out.println("Working?");
}*/
Person person = (Person) in.readObject();
System.out.println(person.id);
// Here is the
// ClassNotFoundException
}
} catch (Exception e) {
e.printStackTrace();
}
}
另外一个建议是,在java套接字编程中,你应该在读/写多个对象时使用BufferInputStream
/ BufferedOutputStream
。它会带来更好的表现。