이전 포스팅에서 c언어로 개발된 back-office와 tcp 통신을 하는 과정을 다뤘습니다.
잘려서 오는 byte를 다루는 library를 만들기 위해서는
1) 총길이가 12300byte일 경우 세번째로 자르면 4025byte 나 4023byte 혹은 그 이외 값으로 자르는지
2) 위 과정이 출금 내역조회인데, 다른 계좌로 출금 내역 조회시 4025byte나 4023byte로 자르는지
3) 입금내역 조회시에도 4025byte나 4023byte로 자르는지
위 세가지 조건을 확인해야했는데요.
코드를 더 파보니 4024byte로 back-office에서 임의적으로 자르고 있었습니다.
뭐 tcp가 자르든, back-office에서 자르든 일단 잘려서 오니 library개발을 진행했습니다.
(참고로 tcp 기본 잘리는 단위는 4096byte였던거 같습니다.)
input에 대한 output, io가 tr(통신)마다 달라 각 tr마다 약간씩 다르긴 했는데 모듈을 대부분 아래와 같았습니다.
let input = **********
let buffer = new Uint8Array([]);
let getSocketRes = new Promise((resolve) => {
socket.on("data", async (socket_res) => {
//쪼개져 오는 buffer를 합치는 process
buffer = Uint8Array.from([...buffer, ...socket_res])
buffer = new Uint8Array(buffer)
buffer = Buffer.from(buffer);
//header분석
let array_count = await js.analyzeHeaderH(buffer, 30)
if (array_count === "123456" && array_count !== -1) {
socket.removeAllListeners()
resolve({
s: 1,
m: response_text["1"],
});
return;
}
})
})
socket.write(input);
res.send( await getSocketRes)
analyzeHeaderH는 다음과 같았습니다.
var analyzeHeaderH = (buffer, body) => {
return new Promise ( (resolve, reject) => {
let buffer_len = Number(buffer.byteLength)
let gap = 4024
//4024넘길경우 헤더(24)가 추가되서 오므로, 4024단위로 24byte추가를 위해 필요
let adding_header = Math.floor(buffer_len/gap)
let array_count = null;
.
.
.
if(message_order !== "L" || message_kind !=="M") {
resolve(-1); //끝이 아닐경우 -1 리턴
return;
} else {
array_count = message.slice(24,29).toString()
resolve(array_count) //끝이면 state 코드 리턴
return;
}
})
}
첫번째 코드에서 주목할 것은 socket.socket.removeAllListeners()입니다.
node의 net 모듈로 socket 통신시, 이전 값이 더해져서 응답이 와 머리를 아프게 했었습니다. 이전값이 더해져서 오면 byteLength는 점점 길어지고, response의 끝을 알수가 없으니 참 난감하죠.
이 현상을 해결시켜준게 socket.socket.removeAllListeners()입니다. 찾아보니 특정 리스너를 제거해준다고는 하는데....음 저에게는 응답이 온뒤 이전 response는 덧붙여서 오게해주지 않더라고요.
느낀점:
서버간 통신을 위해 tcp통신을 이용했고, byte가 점점 늘어나자 잘린 byte를 다루는 경험이 쌓였습니다.
buffer -> string, number, float과 string, number, float-> buffer도 해보니 많이 재밌었습니다. 그리고 소프트웨어 업계가 빠르게 변한다지만, 기존에 있던 코드와 proccess를 아예 무시하긴 어렵기에 원시언어들(c, c++, python, java...)들을 인지해야한다는점이 개발자의 중요 소양중 하나임을 이번 기간동안 느꼈습니다. 앞으로 더 열심히 해야겠네요!
감사합니다.
코드가 보기 어려울경우 이 링크를 참조해주세요: https://medium.com/%EB%8F%84%EA%B9%A8%EB%B9%84-%EC%9D%B4%EC%95%BC%EA%B8%B0/c%EC%99%80-node-js-tcp%ED%86%B5%EC%8B%A0-2-5dff07e96804
'개발 > react 생태계' 카테고리의 다른 글
Error: Cannot find module 'yallist' (2) | 2021.02.02 |
---|---|
Cannot read property 'match' of undefined (0) | 2021.01.09 |
c와 node.js tcp통신 (0) | 2020.07.20 |
styled component in next.js (0) | 2020.07.16 |
Unhandled Runtime ErrorError: React.Children.only expected to receive a single React element child (0) | 2020.07.13 |