이기종간 시스템 연계
JAVA <-> C, C++..
상황
서로 네트워크 통신을 통해서 데이터를 주고 받는 상황
문제
사전에 정의된 포멧대로 데이터를 주고 받았으나
JAVA, C 각각의 시스템 단에서 포멧에 유효하지 않은 데이터들로 수신되기 시작
문제파악
데이터 포멧 예제
1.네트워크 패킷 확인
같은 데이터 포멧을 기준으로 서로 송신하는 테스트를 진행을 했다.
C -> JAVA
C에서는 데이터 타입 구분자를 3
로 보낼것이며 이를 03 00 00 00
으로 저장하여 데이터를 송신한다.
실제 네트워크 패킷을 확인해보면 03 00 00 00
으로 확인되며, JAVA에서 데이터를 읽을때는 왼쪽부터 읽기 때문에 3,000,000
이라는 엄청 큰 숫자로 인식하게 된다.
JAVA -> C
00 00 00 04 00 00
01 8f e5 bd e3 10 00 00
00 03 40 42 13 2c 18 00
00 00 40 60 05 ee 29 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 41 41 52 36 30 33 33 30 78 37 31 63 33 35
39 00
JAVA에서는 데이터 타입 구분자를 4로 보낼것이며 이를 00 00 00 04
로 저장하여 데이터를 송신한다.
실제 네트워크 패킷을 확인해보면 00 00 00 04
로 확인되며, C에서는 데이터를 읽을때 오른쪽부터 읽기 때문에 40 00 00 00
그대로 읽고 결국 40,000,000
이라는 엄청 큰 숫자로 인식하게 된다.
이 문제를 해결하기 위해서는 우리는 엔디안이라는 개념을 알아야한다.
엔디안이란?
컴퓨터 시스템에서 데이터의 바이트 순서를 저장하는 방식이며, 빅엔디안, 리틀 엔디안 2가지 방식이 존재한다.
빅엔디안
리틀 엔디안
빅 엔디안은 첫 번째 주소에 가장 상위 비트인 0x01를 저장, 때문에 데이터를 읽을때는 왼쪽부터 읽는다.
리틀 엔디안은 첫 번째 주소에 가장 하위 비트인 0x04 를 저장, 때문에 데이터를 읽을때는 오른쪽부터 읽는다.
문제상황
같은 엔디안 사이에서의 통신은 문제 없다. 읽는 방식과 쓰는 방식이 똑같다.
다른 엔디안 사이에서의 통신일 경우 문제상황이 발생한다. 읽는 방식과 쓰는 방식이 아예 다르다.
리틀엔디안 에서는 0x12 0x34
데이터를 0x34 0x12
로 저장하여 네트워크로 전송하고
빅엔디안에서는 0x34 0x12
수신하여 왼쪽부터 데이터를 0x34 0x12
읽어들인다. 때문에 데이터를 잘못읽는 문제가 발생한다.
이런 상황 때문에 네트워크 통신에서 빅엔디안 방식이 표준이다.
그래서 본인의 시스템이 리틀 엔디안 방식인 경우에는
네트워크 통신을 했을때 꼭 빅엔디안 처리를 해야지만 나중에 이런 문제가 없다.
네트워크 통신 표준을 꼭 지키자!
'Language > 자바' 카테고리의 다른 글
자바 진수변환 엄청 쉽게 하는 방법 (0) | 2024.08.23 |
---|---|
volatile 이란? (0) | 2024.06.09 |
HashMap과 Hashtable의 차이점 (0) | 2023.10.02 |
JAVA의 WatchService에서 주의할점 (0) | 2023.08.10 |
Java 8 date/time type `java.time.LocalDateTime` not supported by default 문제 해결 (0) | 2022.11.10 |