在java中通过套接字发送对象时,找不到类异常

时间:2016-07-30 12:38:03

标签: java sockets serialization

SimpleClient.java

import java.net.*;
import java.io.*;

class testobject implements Serializable {

    int value;
    String id;

    public testobject(int v, String s) {
        this.value = v;
        this.id = s;
    }
}

public class SimpleClient {

    public static void main(String args[]) {
        try {
            Socket s = new Socket("localhost", 2002);
            OutputStream os = s.getOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(os);
            testobject to = new testobject(1, "object from client");
            oos.writeObject(to);
            oos.writeObject(new String("another object from the client"));
            oos.close();
            os.close();
            s.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

SimpleServer.java

import java.net.*;
import java.io.*;

class testobject implements Serializable {

    int value;
    String id;

    public testobject(int v, String s) {
        this.value = v;
        this.id = s;
    }
}

public class SimpleServer {

    public static void main(String args[]) {
        int port = 2002;
        try {
            ServerSocket ss = new ServerSocket(port);
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            ObjectInputStream ois = new ObjectInputStream(is);
            testobject to = (testobject) ois.readObject();
            if (to != null) {
                System.out.println(to.id);
            }
            System.out.println((String) ois.readObject());
            is.close();
            s.close();
            ss.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

由于您在帖子中重复了testobject课程,很明显您认为可以使用它的两个副本。你不能。您必须在同一个包中的两端使用相同的一个。最好是相同的二进制文件。

如果您发送了空值,则NB readObject()仅返回null。

答案 1 :(得分:0)

正如@EJP所提到的,客户端和服务器应使用相同的testobject类文件。

要验证它,请添加System.out.println("From client: " + to)System.out.println("From server: " + to)以打印包含名称和类名称的对象的完整路径名。

此外,您可以使用关键字instance of来确保在使用对象的类类型之前是您想要的。