2012-10-16 2 views
1

개체을 한 클래스에서 다른 클래스로 보내는 프로그램을 작성하고 있습니다. 다음은 문제를 나타내는 내 프로그램의 간단한 샘플 예제입니다. 보시다시피 서버에서 클라이언트로 보낼 객체는 각 클래스 (서버/클라이언트)에 별도로 정의 된 Student 클래스 입니다.자바에서 TCP를 통해 OBJECT를 보내는 방법은 무엇입니까?

: 여기

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

서버 측 코드입니다 : 나는 잘 작동하지만 난이 오류가 발생하고있어 자신에 의해 정의 된 클래스 유형에 올 때 ArrayList에 전송하여이 코드를 조사 하였다

그리고 클라이언트 측에 대한

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를 추가했습니다. 그것은 잘 작동합니다.

답변

12

같은 이름의 두 클래스가 충분하지 않습니다. 두 개의 클래스가 필요

  • 어떤
  • 이 동일한 serialVersionUID의이있는 경우
  • 이 같은 외부 클래스에있을 같은 패키지.

저는 클라이언트와 서버 모두에 공통적 인 단일 독립 실행 형 클래스를 제안합니다. 좀 더 복잡한 프로젝트에서는 클라이언트 모듈과 서버 모듈이 모두 의존하는 모듈에 이러한 공통 구성 요소를 빌드하는 것을 고려할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다하지만 불행히도 한 프로그램에서 다른 프로그램으로 전송할 개체의 다른 디렉터리를 사용해야하며 여기에 사양이 있습니다.나는 어떤 의견이라도 고맙게 생각한다 : http://tinypic.com/r/26279dt/6 – Bernard

+1

그런 경우에는 내장 Java 직렬화를 사용할 수 없다. 다른 형식의 직렬화를 사용하거나 직접 작성해야합니다. 그들이 지정했다면 Java 직렬화를 사용해야 할 필요가 있는지 이해할 필요가 있습니다. –

+0

@Bernard이 스펙에는 두 개의 Student 클래스가 필요하다는 것은 없습니다. – EJP

4

당신은 이제까지 당신의 문제를 해결하기 위해 클래스 Y.의 인스턴스

에 클래스 X의 인스턴스를 나타내는 스트림을 역 직렬화 할 수없는, 당신은 다른 파일에 Student 클래스의 코드를 이동해야하는 학생을 말한다. java를 사용하고 클라이언트 코드와 서버 코드에서이 단일 클래스를 사용하십시오.

클래스를 수정하는 경우 대부분 서버를 다시 배포해야합니다. 그렇지 않으면 클라이언트는 클라이언트에게만 알려진 클래스 인스턴스를 나타내는 스트림을 서버에 보냅니다.

+0

답장을 보내 주셔서 감사합니다.하지만 불행히도 한 프로그램에서 다른 프로그램으로 전송할 개체의 다른 디렉터리를 사용해야하며 여기에 사양이 있습니다. 어떤 댓글을 주셔서 감사합니다 : http://tinypic.com/r/26279dt/6 – Bernard

+1

이미지에 클래스 학생에 관한 것은 없습니다. –

+1

어쨌든, 그것은 자바 직렬화가 작동하는 방법입니다. 이 규칙을 지키지 못하면 그 규칙을 사용할 수 없습니다. –

2

두 개의 다른 클래스를 참조하고 있습니다. StudentClientSide의 내부이고 Student의 내부 클래스 인 ServerSide입니다. Student 클래스를 다른 파일로 이동해야합니다.

관련 문제