簡體   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