使用TCP反序列化对象

时间:2014-05-18 04:08:05

标签: java sockets tcp deserialization objectinputstream

我正在尝试编写一个基本的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);
    }
}
}

如果有人能帮我解决这个问题,我会很感激。另外,对我(可能)不良编码的一些一般性建议会很好。谢谢!

2 个答案:

答案 0 :(得分:0)

我在从TCP反序列化对象之前遇到此问题;

<强>溶液

您需要将Person类放在服务器和客户端

中的相同名称包中

示例:

服务器 com.utilities - &gt;该文件夹中的人员类

<强>客户端 com.utilities - &gt;该文件夹中的人员类

还会生成serialVersionUID

答案 1 :(得分:0)

我同意Rod_Algonquin。我想补充一下,针对您的具体问题。

您需要做的事情很少,

  1. 就像Rob说的那样,服务器和客户端的Person对象必须位于同一个包中,并且具有类似的 serialvesrionUID
  2. 您的服务器代码应如下所示:(观察评论的行,在您的代码中读取对象两次,只发送一次

    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();
    }
    }
    
  3. 另外一个建议是,在java套接字编程中,你应该在读/写多个对象时使用BufferInputStream / BufferedOutputStream。它会带来更好的表现。