제가 TTCPClient를 사용해서 소켓 클라이언트를 만들었습니다.
서버프로그램을 펄루 했는데 인디소켓으로 하니깐 수신이 잘 안되고
에러가 나서 ......
그래서 수신은 잘되고요.
수신코딩은 스레드안에 ReceiveBuf를 넣어서 구현했는데요.
이게 다음 패킷이 들어오기 전까지는 스레드를 종료할 수 가 없더군요.
그래서 종료 누르고 다음 패킷이 들어올때까지 기다리는 건 이상하자나요?
고수님들은 어찌 프로그램하시나요? 소켓은 첨이라서......
좋은 방법이 없을까요?
아래는 제 코딩입니다.....
일단 연결할 시에는 연결 버튼을 눌러서
procedure TForm1.Button4Click(Sender: TObject);
begin
TCPClient1.RemoteHost := edServer.Text; // 서버 아이피
TCPClient1.RemotePort := inttostr(sePort.Value); // 서버 포트
if TCPClient1.Connect then begin
Label7.Caption := 'Connected';
IdThreadComponent1.Start;
end;
end;
이렇게 처리했구요.
수신은 인디 스레트 컴포의 런이벤트에 넣었습니다.
procedure TForm1.IdThreadComponent2Run(Sender: TIdCustomThreadComponent);
const
MAX_SIZE = 1000;
var
nReceiveLen : integer;
szBuf : array of char;
msg : string;
begin
if TCPClient1.Connected then begin
SetLength(szBuf, MAX_SIZE);
nReceiveLen := TCPClient1.ReceiveBuf(pChar(szBuf)^, MAX_SIZE);
SetLength(szBuf, nReceiveLen);
msg := string(szBuf);
memo1.Lines.Add(msg);
end;
end;
종료시에는 ----------------------------------
procedure TForm1.Button2Click(Sender: TObject);
begin
if IdThreadComponent1.Active then begin
IdThreadComponent1.Stop;
IdThreadComponent1.WaitFor;
end;
TCPClient1.Disconnect;
end;
작업 버전도 안올리다니.. 델파이 7이었구요.
WaitForData()라는 훌륭한 메소드가 있었군요.......
read시에 앞에 써주면 되는군요...