티스토리 뷰

반응형


요 얼마전까지

윈도우와 유닉스간 이기종 통신

프로젝트가 있었다.

충격적인 사실은 처음부터 서로간의 운영체제를

알고 시작한 것도 아니었다는 것.

-_-;;; 지금 생각해 보면

무모하기 짝이 없었던 것 같기도 하고...쩝...

뭐 아무튼

좀 고생했던 기억들을 모아놔야 나중에

곱씹어 볼 수라도 있기 때문에 좀 끄적거려 본다.

기본적인 프로세스는

단말기에서 서버로 통신을 요청하면

서버가 받아서 상대방 서버로 다시 요청하고

응답이 오면 적절히 가공해서 클라이언트 단말기로

다시 보내주는 방식이다. (아주 간단)

대강 이런식.

근데 여기서 문제가 발생한다.

클라이언트와 우리쪽 서버는 둘 다 윈도우 환경이기 때문에 서버 프로그램(java)에서

BufferedReader에서 readLine을 사용하면 개행문자를 정상적으로 판단, 아무 문제가 없다.

그런데 문제는 상대방 서버로 요청을 보내고 readLine상태로 아무리 기다려도 응답이 오지를 않는다는것.

사실 되짚어 본다면 여기서 눈치를 챘어야 하지만

당시에는 상대방측에서 개행문자를 보내주지 않는다고만 생각했었다.

그래서 응답 수신시 String형의 readLine이 아닌 스트림 형식의 inpuStream으로 받는 방식으로 전환,

응답을 받는데 까지는 성공한다.
.
.
.
.
ㅎㅎㅎ 그래서 잘먹고 잘살았다는 얘기의 해피엔딩이 되나 싶었지만

다행히도(?) 문제점이 발생하면서 몰랐던 걸 알게되는 고마운 사태가 벌어지게 된다.

우리쪽 서버에서 상대방 서버로 요청을 보냈을 때

대충 10번중 3,4번은 아예 상대방이 받지를 못하는 상황이 발생한 것.

아예 다 안가면 모르겠는데, 어쩔때는 가고 어쩔때는 안가는 상황이 발생하니

어떻게 해결해야 할지조차 막막...

그러다 우연한 기회로 알게 된 것이 바로 오늘 포스팅의 주제인 이기종 간의 통신시 유의사항이다.

문제는

저쪽 서버 운영체제가 유닉스, 우리쪽은 윈도우 였기 때문에 개행문자를 인식하는 과정에서

그 차이가 있었기 때문이었다.

그러고 보면 최초에 readLine상태에서 응답을 받지 못했다고 생각했던 것도

readLine에서 개행문자를 인식하지 못했기 때문이었다.(거기서 눈치 챘어야 했는데....orz..)

윈도우 에서는
 
개행문자를 CR+LF로 사용하며
===================================================
유닉스 에서는 

개행문자를 LF만 사용한다.
 



이것은 사소한 것 같지만 사실은 그렇지가 않다.

첫 번째로

윈도우 환경에서 작성한 파일(혹은 요청전문)을 유닉스에서 읽을 경우

개행문자를 ^M과 같은 문자로 인식해서 오류를 일으키게 되기 때문이다.


두 번째는

이 경우 개행문자가 보이지 않기 때문에 사실상 잡기가 어려운 버그라는 점이다.

그래서

개발자는 눈으로만 보지말고 마음의 눈으로 봐야한다는

.
.
.

말은 집어치우고 개발하기 전에 세부적인 사항을 상대편과 아주 세세한 사항까지도

나눠야 한다는 말이다...

아, 그렇다고 해서 마음수양이 불필요 하다는 얘기는 아니고....;;;;

이거 때매 쫌 고생을 해서 그냥 끄적여 보는거임.

(사실 big endian, little endian까지 생각했으나 거기까지 안간건 다행 ㅎ)

아, 해결은 어떻게 했냐하면

전부 스트림으로 받아서 바이트수로 짤라서 보내고 받는걸로 해결봄.


(이번 포스팅은 그림이 없어서 좀 심심허네.....)





블로그코리아에 블UP하기




 
반응형
댓글
반응형
05-17 05:57
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함