2010-05-29 7 views
0

UDP를 사용하는 두 대 이상의 컴퓨터간에 통신이 이루어지는 Java 프로그램을 작성하고 있습니다. 내 응용 프로그램은 네트워크를 통해 직렬화 된 객체를 다른 컴퓨터로 보내서 직렬화 및 처리됩니다. 나는 지금까지 한 종류의 물건을 보내는데 성공했다.자바를 사용하여 UDP를 통해 다른 객체를 보내고받습니다.

내 문제는 발신자가 다른 종류의 개체를 보낼 수 있고 수신자가 수신하여 해당 유형으로 다시 전송할 수있게하려는 것입니다. 그러나 UDP는 바이트 버퍼를 할당하고 버퍼에 데이터를 수신하므로 서로 다른 객체가 서로 다른 크기를 가지기 때문에 수신 된 객체의 유형을 형 변환하거나 검출 할 수 없습니다.

다른 종류의 개체를 UDP를 사용하여 보내고 다른 쪽 끝에서받을 수있는 방법이 있습니까?

감사

을 (I, 여기에 코드를 단지 몇 가지 아이디어를 요구하지 않음)

편집 : 나는의 유형이 무엇인지 모른 채 다른 개체 유형을 송/수신 할 수있는 가장 좋은 방법을 찾고 있어요 다음 예상 개체. 세 가지 유형의 객체가 있고 어떤 유형의 객체 유형이라도 받아들이 길 기대합니다. 브라이언 (Brian)의 의견을 듣고 나서 또 다른 한 가지 : 문자열, 배열 등과 같이 가변 크기의 데이터 유형에 대한 버퍼 크기를 설정하는 방법. UDP 패킷을 수신 할 때 먼저 해당 객체를 수신 할 수있는 크기의 버퍼를 할당해야합니다. 이것은 어떻게 든 내 원래의 질문과 관련이 있습니다.

+0

일부 코드를 게시하는 것이 유용 할 수 있습니다. 객체의 유형에 따라 내용의 크기가 다를 수 있습니다. –

+0

buildin java serialization을 사용하지 않아도 될까요? 이 경우 : 수신기에서 처리 할 수 ​​있도록 콘텐츠의 클래스 이름을 보내면됩니다. – Daniel

+0

@Brian : 사실,하지만 개체에 원시 데이터 형식 만 사용했다면 문제가되지 않을 것입니다. @ 대니얼 : 아니요, 여기에 내장 된 것을 사용하고 있습니다. – AAA

답변

2

페이로드가 Object 인 알려진 유형 (Packet)으로 포장하지 않으시겠습니까? 그런 다음 Packet을 deserialise하여 해당 유형의 결과 페이로드를 조사 할 수 있습니다.

2

직렬화 (ObjectOutputStream 사용)하거나 ObjectInputStream을 사용하여 직렬화 해제 할 수도 있습니다. 그런 다음 개체를 검색합니다. UDP, TCP, 파이프, 로컬 파일 등을 통해 전송하면 아무런 역할을하지 않습니다. 직렬화는 OutputStream에 기입 해, 직렬화 복원은 InputStream로부터 읽습니다.

당신이받은 것을 감지하기위한 myObject.getClass().

+0

직렬화, 전송, 수신 및 역 직렬화는 모두 특정 객체를 염두에두고 성공적으로 수행되었습니다. 다음 오브젝트의 유형이 무엇인지 모른 채 다른 오브젝트 유형을 송신/수신하는 가장 좋은 방법을 찾고있었습니다. 세 가지 유형의 오브젝트가 있고 어떤 주어진 시간에 그 중 하나를 받기를 기대한다고 가정 해보십시오. – AAA

0

기본적으로 개체를 deserialize하고 instanceof 검사를 수행합니다. 의사 코드에서 JGroups

, 작업 : UDP를 사용하는 경우 명시 적으로 바이트 버퍼의 문제를 언급하기 때문에, 나는 이미 바이트 버퍼 관리의이 종류를 수행하는 메시징 라이브러리에서 보면 에 한 제안 위해 JGroups는 다음과 같다 :

JChannel channel = new JChannel("myapp"); Customer c = new Customer("IniTrodeInc.); Book b = new Book("Twilight"); channel.send(new Message(c)); channel.send(new Message(b)); 

와 수신 끝에

JChannel channel = new JChannel("myapp"); 
channel.addListener(new Listener(){ 
public void onMessage(Message m) { 
    if (m.getObject() instanceof Customer) { 
    handleNewCustomer((Customer)m.getObject())); 
    } else if (m.getObject() instanceof Book) { 
    handleNewBook((Book)m.getObject())); 
    } else { 
    // Ups, we received s.t.h else 
    } 
} 
}); 

위해 JGroups 가 자동 Y를 메시징 채널의 추출을 수행 이것이 UDP, TCP 또는 멀티 캐스팅인지 여부를 알 필요가 없습니다. JGroups도 피어 통신을 처리합니다. 메시지를 아직받지 못한 피어 노드로 메시지 보내기.

관련 문제