델파이 기본소켓은 기본적으로 비동기방식이어서 Active=true한다고 해서 바로 접속되지 않습니다.
OnConnect이벤트에서 접속을 체크한 뒤에 데이터를 보내거나, Indy와 같은 동기식 소켓으로 바꾸세요.
김수정 님이 쓰신 글 :
: 델파이 2010를 사용하구요.
: ServerSocket과 ClientSocket으로 소켓프로그램을 하다가 데이터전송을 두번씩 해야 서버에 데이터가 표시됩니다.
: 아주 간단하게 샘플프로그램으르 만들어 봤더니 역시 마찬가지입니다.
:
:
:
: 서버측 소스코드입니다.
: =================================================================================
: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
: begin
: ServerSocket1.Active := false;
: end;
:
: procedure TForm1.FormCreate(Sender: TObject);
: begin
: ServerSocket1.Port := 23;
: ServerSocket1.Active := True;
: end;
:
: procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
: begin
: Memo1.Lines.Add(Socket.RemoteAddress + ' sends :') ;
: Memo1.Lines.Add(Socket.ReceiveText);
: end;
: =================================================================================
:
:
:
: 다음은 클라이언트측 소스코드입니다.
: =================================================================================
: procedure TForm1.Button1Click(Sender: TObject);
: begin
: ClientSocket1.Port := 23;
: ClientSocket1.Host := Edit1.Text;
: ClientSocket1.Active := true;
:
: ClientSocket1.Socket.SendText(Edit2.Text);
:
: ClientSocket1.Active := false;
:
: end;
: =================================================================================
:
:
: 이렇게 했는데 Button1을 두번 클릭해야 서버의 Memo1에 표시가 됩니다.
:
:
: 클라이언트에서
: 폼을 오픈할때 미리 ClientSocket1.Active := true; 를 해두면 한번 클릭해도 잘되는걸 보니
: ClientSocket1.Active := true;
: 하고 나서 바로
: ClientSocket1.Socket.SendText(Edit2.Text);
: 를 해주니 문제가 되는것 같은데요.
:
: 수시로 여러 피시로 데이터를 보내야 하기 때문에 이렇게 밖에 할 수 없거든요.
:
:
: 어디를 수정해야 하나요?
|