Q&A

  • [질문]TTcpClient 문의입니다.
서버에서 받은 문자들은 클라이언트 메모에 잘 찍힙니다.
그런데 서버에 문자를 보낼때... 문제입니다.

접속 후 처음 서버에 문자를 '12345' 보냈을때는 서버에서 잘 받아집니다!
헌제 두번째로 '54321' 문자로 보내면... 처음에 왔던 '12345' 문자가 서버에서 받습니다.

서버 접속 후 맨 처음 보낸 문자만 계속 서버에서 받아집니다!

근데 신기한것은 서버에서 수신으로 'OK' 로 보내면 당연 클라이언트 로그에는 'OK'라고 잘 받아집니다.

그리고 클라이언트에서 다시 '54321' 서버에 보내면 '1234554321' 이케 서버에서 받습니다.

도통 무슨 문제인지 모르겠습니다. 어떤 문제인지 도움을 청합니다.

사용하는 컴퍼넌트
tcClient: TTcpClient;
tcThread: TIdThreadComponent;

TCPSercer 접속시 사용...
function TDM.GetComSvrConnect(pIP, pPort: String): Boolean;
begin
  try
    tcClient.Active := FALSE;
    tcClient.Disconnect;
    if (pIP = '') or (pPort = '') then Exit;
    tcClient.RemoteHost := Trim(pIP);
    tcClient.RemotePort := Trim(pPort);
    tcClient.Connect;
  finally
    Result := tcClient.Connected;
    tcThread.Active := Result;
    if Result then DM.tcThread.Start;
  end;
end;

TCPSercer 종료시 사용...
procedure TDM.SetComSvrDisconnect;
begin
  tcClient.Disconnect;
  tcClient.Active := FALSE;
  tcThread.Stop;
  tcThread.Active := FALSE;
end;


문자 송신시 사용...
procedure TfmTCPSocket.BtnSendClick(Sender: TObject);
const vSendArySize = 500;
var
  f1: Integer;
  vSendStr: String;
  vSendBuf : array of Char;
begin
  vSendStr := Trim(mmSendMsg.Text);
  SetLength(vSendBuf, vSendArySize);
  for f1 := 0 to Length(vSendStr)-1 do vSendBuf[f1] := PChar(vSendStr)[f1];
  DM.tcClient.SendBuf(PChar(vSendBuf)^, Length(vSendBuf));
  mmSocketLog.Lines.Add(String(vSendBuf));
end;

문자 수신시 사용...
procedure TDM.tcThreadRun(Sender: TIdCustomThreadComponent);
const vRcvArySize = 500;
var
  vRecvStr: String;
  vRecvSize: Integer;
  vRecvBuf : array of Char;
begin
  if (not tcClient.Connected) then Exit;
  SetLength(vRecvBuf, vRcvArySize);
  vRecvSize := tcClient.ReceiveBuf(PChar(vRecvBuf)^, vRcvArySize);
  vRecvStr := String(vRecvBuf);
  fmTCPSocket.mmSocketLog.Lines.Add(vRecvStr);
end;
0  COMMENTS