繁体   English   中英

如何在Java中通过TCP发送对象?

[英]How to send an OBJECT over TCP in java?

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

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

这是服务器端的代码:

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();
        }
    }
}

对于客户端而言:

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();
        }   
    }   
}

编辑:

我将它们移到同一文件并添加了序列化ID。 工作正常。

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

  • 同一包
  • 在同一个外层阶级(如果有)
  • 具有相同的serialVersionUID。

我建议您有一个单独的类,对于客户端和服务器都是通用的。 在更复杂的项目中,您可能会考虑在客户端和服务器模块都依赖的模块中构建这些通用组件。

您永远无法将代表类X的实例的流反序列化为类Y的实例。

为了解决您的问题,您需要将Student类的代码移动到另一个文件,例如Student.java,并在客户端代码和服务器代码上使用该单个类。

请注意,如果您修改类,则在大多数情况下,您将需要重新部署服务器(否则客户端将向服务器发送一个流,该流表示仅客户端知道的类实例)。

您正在引用两个不同的类。 StudentClientSide的内部, StudentServerSide的内部类。 您应该将Student类移动到其他文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM