Q&A

  • [질문] Socket통신중 의문점.
개발 환경은 Delphi6 + Indy9을 사용하여

Socket서버를 구현중에 있습니다.


내용은 특정 전문을 받아, 그 전문의 요청에 따른 데이터를 채워 다시 수신하는 형태의 통신인데,
문제가 좀 생겼습니다.


보통 소켓서버쪽에서는 클라이언트의 Connect요청에 의해 하나의 쓰레드를 생성하고, Disconnect될때,
이 쓰레드가 사라지는걸로 알고 있습니다.


근데 고객의 서버가 호스트인지라, TCP/IP통신을 마치 X.25와 같은 형태의 통신을 구현해 달라고 했는데,
내용을 보니, 동일한 클라이언트에서 항상 Connection을 유지하고, 수신데이터를 동일한 세션에서 보낸다고 하던군요. 그것도 상당양의 전문을요.


근데 가만생각해보니, 이게 문제가, 만약 하나의 Connection으로 계속 전문을 서버쪽에서 수신하게 되면,
직렬처리야 가능하겠지만, 병열처리는 불가능할거 같은 생각이 들더군요.


보통 서버쪽에서 각 클라이언트에 따른 TIdPeerThread를 생성해주고, 처리중 다른 클라이언트가 요청을 하더라도, 또 다시 TIdPeerThread를 생성해줘서 병렬 처리가 가능한 걸로 알고 있는데,

위에 같은 경우 TIdPeerThread는 하나만 생성될 것이고, 그렇게되면 건당 처리속도가 2초라고 할때
최대 처리 속도는 2초*전문수신수 만큼이 될거란 계산이 나오는데요. 즉 맨 마지막에 수신을 요청한 전문은
앞에 처리때문에 수초 혹은 수분간 기다려야하는 상황이 발생하는 문제가 발생 할 수 도 있겠단 생각 들더군요.



궁금한건, 제가 위에서 생각한 형태로 정말 저렇게 시간이 걸리는건지,

만약 그렇다면, 위와 같은 전문을 병열로 구현하기 위해선 어떠한 작업이 필요한지 입니다.



정말 골치아프네요. ㅠ.ㅠ

많은 분들의 고견을 기다리겠습니다. 감사합니다.
4  COMMENTS
  • Profile
    zeliard 2011.06.01 23:30

    병렬처리라... 걱정하실 필요가 없습니다. 서버와 여러 클라이언트들과의 커넥션이 하나라는것은 존재할 수가 없습니다.

    단 X.25는 TCP/IP와 달리 연결되면 네트워크상의 경로가 서킷망처럼 고정된다는 점이 다를뿐입니다.

  • Profile
    우당탕탕 2011.06.01 23:42

    답변 감사합니다.

     

    제가 글을 잘못 올린듯 한데요.

     

    서버와 클라이언트가 각각 하나입니다.

    측 하나의 클라이언트에서 전문을 계속 송신 합니다.

     

    클라이언트가 여러대라면 걱정할 필요가 없는데, 클라이언트가 한대 입니다.

    마치 TCP/IP를 X.25처럼 쓰는 형태라고 하더군요.

  • Profile
    이정욱 2011.06.02 00:17

    Que 를 만들어서 사용하세요.

    그리고 처리 루틴을 원하시는 쓰레드 수 만큼 생성 후, 각 쓰레드에서 Que에서 하나씩 뽑아다가 처리 시키면 되죠 ^^

    즉 소켓은 전문을 받는 용도로만 쓰고, 처리는 다른 쓰레드에서 처리를 하면 됩니다.

  • Profile
    zeliard 2011.06.02 01:34

    정욱님 말씀이 정답입니다.

    • 심즈
    • 2011.07.15 00:57
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2011.08.11 22:24
      project1.dof 파일이 있는 위치를 열어서 확인해보세요.. 디렉토리가 읽기 전용으로 되어 있다거나, 파일이...
    • 심즈
      2011.08.25 00:27
      답변 감사합니다.. 확인 해 볼게요..^^
    • 수원성
      2011.07.26 18:34
      QR Code가 많이 사용 (서적,스마트 폰 사용)2D Barcode VCL Componentshttp://www.han-soft.com/barcode2d....
    • Jins_lee
      2011.08.03 19:54
      델파이 3에서도 출력 가능했습니다. 이미지 형태로 만들어서 넣었던 걸로 기억합니다. 
    • 심즈
    • 2011.07.02 20:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 심즈
      2011.07.03 07:37
      Form의 오브젝트 인스펙터에서 HorzScrollBar 속성 의 Tracking 을 True 로 하니 웹브라우저도 ...
    • 빡스
    • 2011.06.25 04:37
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 소나기
      2011.06.25 16:38
      책이 거의 전무하다 싶네요.인터넷 서점을 보시면 중고책을 팔고 있습니다. 그런데서 한번 찾아 보시고.시...
    • 수인아빠
      2011.06.27 17:30
      7월중에 데브기어에서 책이 출간된다는 소식이 있긴 합니다.....
    • zeliard
      2011.06.17 07:00
      TScrollBox에 TImage를 넣어서 써보세요.
    • anonymous
      2011.06.17 08:14
      http://www.delphi.co.kr/?mid=lecture&document_srl=213987
    • 심즈
    • 2011.06.11 22:12
    • 6 COMMENTS
    • /
    • 0 LIKES
    • zeliard
      2011.06.12 17:02
      장비가 PC로 데이터를 능동적으로 보내면 UDPServer 컴포넌트를 사용하는것이 맞는데... PC에서 장비의 데...
    • 심즈
      2011.06.12 19:35
      최용일님 댓글 감사합니다.. 제 생각에는 UDPClient컴포넌트를 사용해서 장비의 Data를 읽는 방법이 ...
    • zeliard
      2011.06.13 20:14
      접속이 성공했다면 절반 이상은 하신겁니다. 데이터 읽는것은 장비의 매뉴얼을보세요. 장비의 프로토콜에 ...
    • 심즈
      2011.06.14 05:57
      최용일님 정성스러운 답변 감사합니다^^ 제가 자꾸 글을 올려서 죄송합니다만.. UDPClient 컴포넌트로...
    • zeliard
      2011.06.14 19:49
      인디 예제를 보세요.     IdUDPClient1.Host := '192.168.0.10';  // Server IP address &n...
    • 심즈
      2011.07.02 20:11
      답변 감사합니다^^
    • 구창민
      2011.06.11 02:09
      API 가 존재합니다. 아래 함수를 사용해 보세요. function _GetLogonUserName : String;var&n...
    • 누구를대신해
      2012.06.12 02:09
      그런방법이
    • zeliard
      2011.06.01 23:30
      병렬처리라... 걱정하실 필요가 없습니다. 서버와 여러 클라이언트들과의 커넥션이 하나라는것은 존재할 수...
    • 우당탕탕
      2011.06.01 23:42
      답변 감사합니다.   제가 글을 잘못 올린듯 한데요.   서버와 클라이언트가 각각 하나입니다. 측...
    • 이정욱
      2011.06.02 00:17
      Que 를 만들어서 사용하세요.그리고 처리 루틴을 원하시는 쓰레드 수 만큼 생성 후, 각 쓰레드에서 Que에서...
    • zeliard
      2011.06.02 01:34
      정욱님 말씀이 정답입니다.
    • 은우
    • 2011.05.31 03:15
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2011.05.31 03:52
      아주예전에 올렸던건데요. :   는 선언문(~이다), GOTO문의 레벨명에 사용도 합니다.:= &nb...
    • 은우
      2011.06.01 17:43
      감사합니다.
    • 완전한사랑
      2011.05.31 18:58
      자문 자답을 하게 되는 군요,,, ^^ procedure Copy_File(FromFile, ToFile: String); var FD...
    • 소프트테크
      2011.05.27 16:22
      짚어봐야 할 사항 들입니다.1. 통신포트를 설정하고 , 통신포트를 열었는가?2. 통신포트의 설정내용은 정확...
    • 소나기
      2011.05.27 19:28
      음 스크롤 되고 있는 상황인걸 보니   데이터는 들어 오고 있네요.   들어 오는 데이터가 아스...
    • 초보델피언
      2011.05.25 20:48
      정확히 어떤 필드가 숫자형인지는 모르지만 ''' 를 ' 만 사용하면 되지 않을까요?
    • 완전한사랑
      2011.05.25 21:59
      답변 감사드립니다..  제가 너무 설명을 못한거 같네요. .ㅠ.ㅠSqlData[1]~[25]까지 전부 문자형으...
    • karl
      2011.05.26 19:10
        Query.SQL.Clear;  Query.SQL.Add('INSERT INTO 테이블 (컬럼1,  컬럼2, 컬럼3) &nb...
    • 완전한사랑
      2011.05.27 19:18
      답변 감사합니다.. 우선 여러 가지 방법으로 함 해보려고 합니다..말씀 하신 내용 참고해서 작업해 볼께...
    • karl
    • 2011.05.24 02:08
    • 4 COMMENTS
    • /
    • 0 LIKES
    • zeliard
      2011.05.24 17:26
      TIdTCPClient.ReadTimeout을 설정해보세요.
    • karl
      2011.05.24 18:36
      ReadTimeout 을 5 ~ 5000 까지줘봤는데, 커넥트 하자마자 ReadTimeError 가 나오네요.
    • zeliard
      2011.05.25 15:14
      데이터가 없으면 예외가 발생합니다. 예외처리하시고 데이터가 올때까지 기다리세요.
    • karl
      2011.05.25 18:31
      아... 그런거였군요! 감사합니다!! ^^
    • karl
    • 2011.05.23 20:02
    • 2 COMMENTS
    • /
    • 0 LIKES
    • zeliard
      2011.05.23 21:56
      포인터를 보내면 안됩니다. 포인터의 내용을 보내야죠... 포인터는 현재 프로그램내에서만 유효한 값입니다...
    • karl
      2011.05.24 01:59
      답변감사드립니다.    다음과 같이 두번 전송하여 해결하였습니다.    WriteBuff...