如何在java中通过TCP发送OBJECT?

Ber*_*ard 1 java sockets connection serialization tcp

我正在编写一个程序来将一个对象从一个类发送到另一个类.这是我的程序的一个简短示例,用于表示问题.正如您所看到的,从服务器发送到客户端的对象是Student类,它已在每个类(服务器/客户端)中单独定义.我已经通过发送一个工作正常的ArrayList检查了这个代码但是当涉及到我自己定义的类类型时,我收到了这个错误:

Exception in thread "main" java.lang.ClassCastException: ServerSide$1Student cannot be cast to ClientSide$1Student
    at ClientSide.main(ClientSide.java:29)
Run Code Online (Sandbox Code Playgroud)

这是服务器端的代码:

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

public class ServerSide {

    public static void main(String[] args) {
        class Student implements Serializable
        {
            int id;
            public Student(int num){id=num;}
            public void setID(int num){id=num;}
            public void Print(){System.out.println("id = " + id);}
        }
        try
        {
            Student a = new Student(3);
            ServerSocket myServerSocket = new ServerSocket(9999);
            Socket skt = myServerSocket.accept();   
            try 
            {
                ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream());
                objectOutput.writeObject(a);                
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            } 
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于客户端来说:

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSide {

    public static void main(String[] args)
    {
        class Student implements Serializable
        {
            int id;
            public Student(int num){id=num;}        
            public void setID(int num){id=num;}
            public void Print(){System.out.println("id = " + id);}
        }
        try {       
            Socket socket = new Socket("10.1.1.2",9999);
            try {
                ObjectInputStream objectInput = new ObjectInputStream(socket.getInputStream());
                try {
                    Object object =(Student) objectInput.readObject();
                    Student tmp = (Student) object;
                    tmp.Print();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }           
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }   
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我将它们移动到同一个文件并添加了序列号.它工作正常.

Pet*_*rey 12

拥有两个具有相同名称的类是不够的.这两个班需要

  • 相同的包裹
  • 如果有的话,在同一个外层
  • 具有相同的serialVersionUID.

我建议你有一个单独的,独立的类,这对客户端和服务器都很常见.在更复杂的项目中,您可以考虑在客户端和服务器模块都依赖的模块中构建这些公共组件.