직장에서 나는 로봇 그룹을 제어하기위한 사용자 인터페이스를 설계하고 있습니다. 로봇은 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 개발이고, 다른 사람은 매우 환영받을 인공 지능 프로그래머/하드웨어 전문.이 문제를 가진 모든 모든 도움이됩니다.
이러한 메시지의 틀을 짓기 위해 사용하는 프로토콜은 무엇입니까? –
무엇을 의미합니까? 우리는 지금 바로 스트링 String 데이터를 보내고 테스트하고있다. Java 코드의 핵심은 위에 나열되어 있습니다. Boost 코드는 Boost Asio TCP Synchronous 예제를 기반으로합니다. – Kronos
TCP는 바이트 스트림입니다. 나는 얼마나 많은 바이트 수신기가 기대해야하는지 묻고있다? 헤더가 있습니까? 파수꾼 가치가 있습니까? –