개발 Q&A

제목 socket 통신 관련 질문 및 조언을 듣고자 글을 올려봅니다.
카테고리 서버
글쓴이 Densetsu 작성시각 2017/05/29 09:36:03
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 12058   RSS

안녕하세요.

질문을 요약하자면 첨부된 이미지와 같이 통신이 어떤식으로 구현을 하는게 맞는지 조언을 구하고자 합니다.

일단.. 단촐한 제 상식선에서 정리를 하자면, client 인 내부 서버에서 메시지를 보내고 server 측에서 응답하고 그 값을 다시 client 가 정상적으로 받으면 자동으로 close 하게 됩니다. 이렇게 될 경우 output 이였던 프로세스는 자동으로 닫히게 되고 다시 요청할 경우 output 이였던 포트값은 변하게 됩니다. (용어들이 맞는지는 잘 모르겠네요.. socket 통신 쪽으로 개발을 많이 안해봐서..)

하지만, 업체측에서의 설명은 초기 socket 통신시 그 값 (통신했던 output 값인 듯..) 을 유지하고 통신하도록 계속 띄워놓으라는 식의 답변이였는데.. 제가 구현한 소스에서는

  1. write 이후 매번 닫히니까(close) 다음 요청시 리턴값이 실패..
  2. 해당 포트로 내부 서버에서 서버형태로 띄워놓으라는건 아닌거 같구요.. (재시작할때마다 포트가 달라지니.. 제 예상입니다)
  3. 지속적인 output 으로의 통신인거 같습니다.

ex) tcp        0      0 127.0.0.1:80                127.0.0.1:34962(<< 매번 요청시 요녀석이 갱신..)             TIME_WAIT   - 

어떻게 구현해야 되는지 감이 안 오네요;; (내부 server 형태로 띄우게 되면 매번 변경되는 포트마다 서버에서 열어줘야 하는 번거로움이 있는데.. 이런건 아니겠죠?..) 제가 잘못 생각하고 있는건지.. ㅠ

샘플 소스는 이렇습니다. (검색해서 찾은 기본 샘플입니다.)

 

var socket = net.connect({port: 포트번호, host:서버 IP});

socket.on('connect', function listener() {
    console.log('### connected to server! ###');
    console.log('@ IP : ' + socket.localAddress);
    console.log('@ PORT : ' + socket.localPort);
    socket.write(업체 요청 데이터);
});

socket.on('data', function(data) {
    console.log('>> socket Data : ' + data.toString());
    //socket.end();
});

socket.on('end', function() {
    console.log('>> socket End : disconnected from server');
    //socket.connect(port, host);
});

 

업체측 메뉴얼 내용

  1. 제휴업체와 **** 서버 간에는 TCP/IP 소켓통신 상에서 Interface 전문 규격을 사용하여 상호 통신한다.
  2. **** 은 Server로 동작하여 제휴업체는 Client로 동작한다.
  3. 제휴업체는 **** 서버로 연결을 요청 하고 연결을 유지 한다.
  4. 제휴업체는 **** 서버로 하나의 연결만을 요청 할 수 있다.
  5. 모든 전문 처리는 고정 포맷의 문자열(char)을 이용하여 인터페이스 한다.
  6. 제휴업체는 30초이내 수신 전문이 없을 경우 HEARTBEAT 전문을 전송하여야 하고 HEARTBEAT전문 전송 후 5초 이내 응답이 없을 경우 연결을 끊고 재연결을 하여야 한다.
  7. **** 서버는 제휴업체로부터 35초 이내 수신 전문이 없을 경우 연결을 끊고 대기한다.
  8. HEARTBEAT 전문은 전문 공통부(Header)만을 이용하여 인터페이스 한다.

 

관련해서 구현을 해보신 적이 있거나 대략적인 프로세스를 아시는 분이 있으시다면 조언 부탁 드리겠습니다 ㅠ

긴글 읽어주셔서 감사합니다.


첨부파일 example.jpg (53.5 KB)
 다음글 HTML video태그와 mp4관련 질문입니다. (5)
 이전글 php ssesion upload progress 세션... (6)

댓글

변종원(웅파) / 2017/05/29 10:18:01 / 추천 0

소켓은 지속적으로 붙어서 어떤 역할을 하도록 할때 사용합니다. 업체측 답변이 맞구요.

연결-리턴-종료 형태로 지속적으로 사용하려면 소켓이 아닌 restful 방식으로 사용하는 것이 맞습니다.

php방식처럼요. request - resonse(프로스세 끝)

Densetsu / 2017/05/29 10:29:31 / 추천 0

//웅파

글을 많이 올리진 않았지만.. 그 때 마다 답변주시니 감사 드립니다. ^^

샘플 코드쪽 보시면 write 하고 자동으로 close 되는 현상 때문에 업체측에서 요구하는 프로세스를 구현할 수 없는 상태입니다.

물론 close 하고 자동으로 재연결해서 호출하는 소스도 추가해봤지만 그 때 output 하는 포트값이 변경되어 인식이 안된다고 리턴 메시지가 오는게 문제였습니다.. ㅠ

제가 관련해서 깊은 지식이 없는 관계로.. 위와같이 통신이 가능한 관련 샘플 및 참고할 수 있는 사이트나 검색 키워드 같은거 하나 주실 수 있을까요?

변종원(웅파) / 2017/05/29 12:55:28 / 추천 0

Densetsu/ restful api로 검색해서 개념 파악하시고 codeigniter restful로 검색하시면 사용하시기에 괜찮은 라이브러리 나옵니다.

http를 이용하는 방식이라 포트 변동이 없고 단순히 호출하고 권한이 맞다면 해당 결과를 리턴하는 단순한 구조입니다.

Densetsu / 2017/05/29 13:37:10 / 추천 0

웅파//

신경써 주셔서 감사 드립니다 ^^

업체측에 문의해본 결과.. 방식이 잘못된게 아니라.. 제가 데이터를 잘못 주고 있었다고 하네요; 잘못주니 세션을 유지하지 못하고 disconnect  했다고 합니다. (리턴값은 정상으로와서 제가 판단을 잘못했습니다.. 진작에 물어볼껄.. ㅠ)

답변 감사 드립니다!