2011-05-10 3 views
2

다음은 클라이언트 응용 프로그램에서 서버 응용 프로그램으로 보내려는 사용자 정의 클래스의 예입니다.자바에서 tcp/ip 네트워크 연결을 통해 사용자 정의 클래스 객체를 어떻게 보냅니 까?

class dataStruct implements Serializable{ 
    byte data; 
    int messageNum; 
    public void setData(byte datum, int messageNumber){ 
     data=datum; 
     messageNum=messageNumber; 
    } 
} 

Java에서 tcp/ip 연결을 통해 사용자 정의 클래스를 보내는 방법은 무엇입니까?

이 작업을 수행하는 데 사용할 수있는 스트림 유형은 무엇입니까 (단순히 텍스트 이상을 보내는 경우)?

소켓 스트림을 통해 전체 객체를 전달할 수 있습니까? 아니면 스트림을 통해 전달 된 후에 항상 캐스트해야합니까?

서버/클라이언트 응용 프로그램을 작성 중이며 기본 유형 또는 네트워크 연결을 통해 전달되는 문자열의 예와 함께 자습서를 찾을 수 있었지만 사용자 정의 유형이 아닙니다.

귀하의 도움과 방향을 매우 높이 평가합니다.

+0

HTTP를 통해 JAXB를 사용합니다. 2011 년 이후입니다. 자신을 처벌하지 마십시오. – Kevin

+0

@Kevin : 이것은 서버가 이미 HTTP 서버에있는 경우에만 유용합니다. –

+0

@Paulo : spring-mvc를 사용하는 경우 서버를 HTTP로 전환하는 데 2-3 시간 정도 소요됩니다. – Kevin

답변

4

송신 측에서 ObjectOutputStream을, 수신 측에서 ObjectInputStream을 사용하십시오.

좀 더 명확히하기 위해 예외 처리가없는 예제가 있습니다.

송신 측 :

dataStruct ds = ...; 
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
oos.writeObject(ds); 
oos.close(); 

수신 측 :

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
Object o = ois.readObject(); 
if(o instanceof dataStruct) { 
    dataStruct ds = (dataStruct)o; 
    // do something with ds 
} 
else { 
    // something gone wrong - this should not happen if your 
    // socket is connected to the sending side above. 
} 

그래서 그래, 당신은 컴파일러가 올바른 클래스를 알 수 있도록 수신 측에 캐스팅해야합니다. (캐스팅은 객체의 클래스를 변경하지 않고 컴파일러의 지식 만 변경합니다.)

이 직렬화는 객체를 파일에 저장하는 데에도 사용할 수 있습니다. 물론 이것은 Java와의 상호 운용성 만 제공합니다. Java가 아닌 파트너가있는 경우 사용자 지정 직렬화 프로토콜 또는 일부 XML 기반 형식을 사용할 수도 있습니다.

+0

이 클래스는 클라이언트 및 서버 측에서 알려져 있다고 가정합니다. – MeBigFatGuy

+0

물론 가능합니다. 그것이 알려지지 않았다면, (RMI가하는 것처럼) 알릴 필요가 있거나 전송할 것이 무엇인지 생각할 필요가있다. –

+0

감사합니다. Paulo! – Rolan

3

개체에 Serializable 마커 인터페이스를 구현 한 다음 ObjectOutputStreamObjectInputStream을 사용하여 개체를 전송할 수 있습니다. 물체가 다른 쪽 끝에서 나오면 에있는 readObject() 방법을 통해 Object을 반환하므로 올바른 유형으로 캐스팅해야합니다.

관련 문제