안녕하세요?
제가 지금 신용카드사와의 소켓통신을 이용한 승인에 관한 프로그램을 짜고 있습니다.
그런데 모회사와 소켓통신을 하게 되었는데... 모회사는 서버쪽이고 저는 client입니다.
server가 웹 기반입니다. 저는 델파이로 ClientSocket 콤포넌트를 사용하고 있구요..
패킷전송을 합니다.
제가 알기로는 클라이언트 콤포넌트는 패킷을 보낼때는 ClientSocket1.Socket.SendBuf(보낸패킷,길이)
받을때는 클라이언트의 OnRed 이벤트에서 패킷을 받아서 처리하는 걸로 알고 있어요...(맞나?)
예를 들어...
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Socket.SendBuf(보낸패킷,길이);
처리~~~
end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.receivebuf(받은패킷,길이);
처리~~~
end;
위와 같이 하는 걸로 알고 있습니다.
지금 제가 할 것은 배치 작업으로 타이머로 1초~2초 마다 수백건의 데이타를 보내고 결과를 받아서 처리
해야 합니다. "for ~ loop"을 돌면서 계속 보내고 받으려고 합니다.
그런데 클라이언트 콤포넌트는 보내고 받는 프로세서가 따로 있잖아요....
(즉 보내고 받는 프로세서가 다르다는 거죠)
근데 모회사쪽이 웹 기반이므로 한건 받고 보내고 다음건 받고 보내고 이런씩이거든요...
저는 for 문은 돌면서 계속 보낼수 밖에 없잖아요....
모회사쪽 말은 클라이언트 에서 for문을 돌면서 for문 안에서 보내고 받는 즉 ...큐 개념이 아닌 단
한건마다 처리를 해야 한다고 하는군요...
지금까지 저는 개발을 for문을 돌면서 만약 1000건이 있으면 무조건 보낸다는 거였죠...그리고 오면 무조건 받는
다는 개념으로 생각했거든요...
그렇게 하면 안된다는 군요...
무조건 한건 보내고 받아야만 한다는 군요.그리고 그 다음 건 보내고....뭐 이런 식으로...
질문.1
이것이 클라이언트 소켓 콤포넌트에서 가능한가요?
제 생각에는 보내는 소스내에서 for문 안에서 받은 패킷을 처리를 해야 하나요?(할수 있나?)
질문.2
반드시 패킷을 받을때는 ClientSocket1Read에서 해야 하나요?
보낼때는 다른 이벤트에서 하는데....받을때는 꼭 ClientSocket1Read에서 하나요?
고수님들?
어떻게 생각합니까?
제가 어떻게 해야 하죠?
훌륭한 충고 부탁드립니다.
소켓 전송은 CRC-32나 기타 프로토콜처럼 동기식으로 처리하여야 한다는 것입니다.
즉, 받을 준비가 되었다는 Ready 신호를 보내고, 보냈으면 받겠다는 신호와
받고 나서는 잘 받았다는 신호, 계속보내겠다는 신호를 받고 또한 끝일 경우에는
그 신호를 받고 종료신호를 보내야 한다는 것입니다.
아래 내용은 검색엔진에 데이터 요청을 하고 그 결과를 기다리고
반복적으로 데이터를 주고 받는 프로세스를 작성한 예입니다.
참고하시기 바랍니다.
참고로 전송단위를 2048바이트 단위로 처리하였습니다.
procedure TForm1.CSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tReceiveText, tReadMsg, tSendMsg, tGubun: String;
i: Integer;
QryCnt: Integer;
begin
if (SERVER_PORT <= 0) then Exit;
tReceiveText := Socket.ReceiveText;
tGubun := Copy(tReceiveText, 1, 1);
if tGubun = '' then tGubun := #32;
case tGubun[1] of
'0'..'9' : begin
tReadMsg := Copy(tReceiveText, 1, SIZE_QRYCNT);
QryCnt := StrToIntDef(tReadMsg,0);
Label17.Caption := Format('검색갯수: %d', [QryCnt]);
(* 준비신호 전송 *)
if QryCnt = 0 then
begin
SocketErrorCode := SOCKET_ERROR;
ModalResult := mrOk;
Exit;
end;
tSendMsg := Format('%1s%2047s', ['R', #32]);
CSocket.Socket.SendText(tSendMsg);
end;
'C' : begin
ReceiveTextSplit(tReceiveText);
(* 계속 메시지 전송 *)
tSendMsg := Format('%1s%2047s', ['R', #32]);
CSocket.Socket.SendText(tSendMsg);
end;
'E' : begin
ReceiveTextSplit(tReceiveText);
(* 전송 완료 메시지 전송 *)
tSendMsg := Format('%1s%2047s', ['Z', #32]);
CSocket.Socket.SendText(tSendMsg);
ModalResult := mrOk;
Exit;
end;
end;
end;
procedure TForm1.ReceiveTextSplit(ReceiveText: String);
var
s, tmp: String;
begin
s := Trim(Copy(ReceiveText, 2, SID_SIZE * SID_CNT));
while s <> '' do
begin
tmp := Trim(Copy(s, 1, SID_SIZE));
s := Trim(Copy(s, SID_SIZE+1, Length(s)-SID_SIZE));
if tmp <> '' then
if ListBox1.Items.IndexOf(tmp) = -1 then
ListBox1.Items.Add(tmp);
end;
end;
초심자 wrote:
> 안녕하세요?
> 제가 지금 신용카드사와의 소켓통신을 이용한 승인에 관한 프로그램을 짜고 있습니다.
> 그런데 모회사와 소켓통신을 하게 되었는데... 모회사는 서버쪽이고 저는 client입니다.
> server가 웹 기반입니다. 저는 델파이로 ClientSocket 콤포넌트를 사용하고 있구요..
> 패킷전송을 합니다.
> 제가 알기로는 클라이언트 콤포넌트는 패킷을 보낼때는 ClientSocket1.Socket.SendBuf(보낸패킷,길이)
> 받을때는 클라이언트의 OnRed 이벤트에서 패킷을 받아서 처리하는 걸로 알고 있어요...(맞나?)
> 예를 들어...
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
> ClientSocket1.Socket.SendBuf(보낸패킷,길이);
> 처리~~~
> end;
>
> procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
> begin
> Socket.receivebuf(받은패킷,길이);
> 처리~~~
> end;
>
> 위와 같이 하는 걸로 알고 있습니다.
> 지금 제가 할 것은 배치 작업으로 타이머로 1초~2초 마다 수백건의 데이타를 보내고 결과를 받아서 처리
> 해야 합니다. "for ~ loop"을 돌면서 계속 보내고 받으려고 합니다.
> 그런데 클라이언트 콤포넌트는 보내고 받는 프로세서가 따로 있잖아요....
> (즉 보내고 받는 프로세서가 다르다는 거죠)
> 근데 모회사쪽이 웹 기반이므로 한건 받고 보내고 다음건 받고 보내고 이런씩이거든요...
>
> 저는 for 문은 돌면서 계속 보낼수 밖에 없잖아요....
>
> 모회사쪽 말은 클라이언트 에서 for문을 돌면서 for문 안에서 보내고 받는 즉 ...큐 개념이 아닌 단
> 한건마다 처리를 해야 한다고 하는군요...
>
> 지금까지 저는 개발을 for문을 돌면서 만약 1000건이 있으면 무조건 보낸다는 거였죠...그리고 오면 무조건 받는
> 다는 개념으로 생각했거든요...
> 그렇게 하면 안된다는 군요...
> 무조건 한건 보내고 받아야만 한다는 군요.그리고 그 다음 건 보내고....뭐 이런 식으로...
>
> 질문.1
> 이것이 클라이언트 소켓 콤포넌트에서 가능한가요?
> 제 생각에는 보내는 소스내에서 for문 안에서 받은 패킷을 처리를 해야 하나요?(할수 있나?)
>
> 질문.2
> 반드시 패킷을 받을때는 ClientSocket1Read에서 해야 하나요?
> 보낼때는 다른 이벤트에서 하는데....받을때는 꼭 ClientSocket1Read에서 하나요?
>
>
> 고수님들?
> 어떻게 생각합니까?
> 제가 어떻게 해야 하죠?
> 훌륭한 충고 부탁드립니다.
>