2011-08-11 2 views
1

직장에서 나는 로봇 그룹을 제어하기위한 사용자 인터페이스를 설계하고 있습니다. 로봇은 UDP 방송을 사용하여 서로의 움직임을 관리합니다.Java 소켓 클라이언트와 C++ (부스트 기반) 서버 간의 네트워킹

GUI가 로봇과 통신 할 수 있어야합니다. 이를 위해 중간 서버가 실행됩니다. 모든 로봇은 그것을 듣고 (UDP 센서 사용), 실행중인 모든 GUI가 (TCP를 통해) 연결됩니다. GUI < -> 로봇 통신을 관리합니다.

그러나 서버는 C++ Boost 라이브러리로 작성되었으며 GUI는 Java로 작성되며 네트워킹과 관련된 일부 문제가 발생합니다. 소켓으로 서버에 연결하는 것이 매우 쉽습니다.

try { 
    socket = new Socket(targetAddress, targetPort); 
} catch (IOException e) { e.printStackTrace(); } 

서버가 연결을 등록하고 모든 것이 잘 보입니다. 그러나

, 내가 문자열을 보내려고 :

try { 
    stream.writeUTF(message); 
    stream.flush(); 
} catch (IOException e) { e.printStackTrace(); } 

참고 : 그것은 것하지만 만약 DataOutputStream 정렬로 전환 내가 처음에 한 번에 문자열을 보내기 위해 PrintWriter를 사용하고 있었다 ((가)에 println)를 볼 수 있습니다 도움.

문제가 발생합니다. Boost는 Java가 성공적으로 수행 했음에도 불구하고 내가 보낸 메시지를 등록하지 않습니다. 또한 문자열을 서버에서 보낼 때 인식 할 수없는 형식입니다.

문제를 조사한 결과 부스트는 보내는 모든 메시지에 "헤더"텍스트를 자동으로 추가하여 수신 한 메시지를 보관할 수 있음을 보여줍니다. Java는 이것을하지 않기 때문에 이것이 원인 일 수 있습니다. 이 올바른지? 그렇다면 어떻게해야할까요?


몇 가지 참고 사항 :

  • 시간 제약으로 인해, 대규모 다른 라이브러리/언어 전환은 정말 옵션이 아닙니다. 그러나 서버에서 보낼 메시지를받을 수있는 C++ TCP 라이브러리가 있고이를 쉽게 통합 할 수 있다면 이 될 것입니다.
  • Java 네트워킹 코드는 Java 서버에 연결할 때 완벽하게 작동합니다. Boost-Java 인터페이스에서 문제가 발생하는 것 같습니다.
  • 불행히도 프로젝트의이 측면에서 일하는 사람이나 다른 사람이 네트워킹에 경험이있는 사람이 아닙니다. :(내 경험 Java 및 GUI 개발이고, 다른 사람은 매우 환영받을 인공 지능 프로그래머/하드웨어 전문.이 문제를 가진 모든 모든 도움이됩니다.
+0

이러한 메시지의 틀을 짓기 위해 사용하는 프로토콜은 무엇입니까? –

+0

무엇을 의미합니까? 우리는 지금 바로 스트링 String 데이터를 보내고 테스트하고있다. Java 코드의 핵심은 위에 나열되어 있습니다. Boost 코드는 Boost Asio TCP Synchronous 예제를 기반으로합니다. – Kronos

+0

TCP는 바이트 스트림입니다. 나는 얼마나 많은 바이트 수신기가 기대해야하는지 묻고있다? 헤더가 있습니까? 파수꾼 가치가 있습니까? –

답변

0

시작 첫번째 바이트를 수신 &를 전송하여, 다음 int 크기 조정 (C++에서 fe 64 비트 int) 및 바이트 순서 지정 (가장 중요도가 가장 낮은 것부터 가장 중요 함)을 알고 있어야합니다. Sam Miller가 언급했듯이 사용자가 보낼 수있는 메시지의 종류를 정의하는 자체 프로토콜을 만들어야합니다. & 그 요소들이 어떻게 주문되는지 ...

부스트가 문자열의 길이를 먼저 보낸다. 부스트 라이브러리와 와이어 f를 사용하여 보낸 메시지의 와이어 포맷을 읽는다. DataOutputStream에 의해 사용되는 Ormat

0

우선 인코딩, 바이트 순서 및 부스트가 명령의 시작과 끝을 결정하는 데 사용하는 패키지 형식을 알아야합니다. 예를 들어, comand는 WALK와 같을 수 있지만 연결을 통해 WALK 문자열을 전송하지는 않습니다. \ n과 같은 구분 기호를 사용하여 보낼 수 있습니다. WALK \ n 다른 것은 인코딩이 사용하는 것을 알고, 문자열 메소드 myString.getBytes ("UTF-8")을 사용할 수 있습니다. socket 's outputstream을 사용하여 네트워크를 통해 UTF-8로 바이트 []를 보냅니다.

관련 문제