1. 2011. 4. 17. 01:36 Tutorials/IDE]Delphi 7.2
델파이 소켓 입니다.
몇가지 기능이 동작되지 않는 점이 있음으로, 해당 버전에서는 신뢰가 안됨을 미리 표시 해둡니다.
델파이에서 Indy 라이브러리Win32 API 로 통신기능 대체가 가능합니다.

TCP 소켓은 연결 지향형 임으로, 서버에 접속후 통신을 진행 합니다.


전역 변수 및 쓰래드 클래스
type
  TThread0 = class(TThread)
  protected
    procedure Execute(); override;
  end;

var
  MainForm: TMainForm;
  Thread0: TThread0; 
  index: Cardinal;

폼 시작 & 폼 종료때 TCP서버(VCL) 컨트롤의 작동을 시작 시킵니다.
procedure TMainForm.FormCreate(Sender: TObject);begin
  TcpServer1.Active:=False;
  TcpServer1.Active:=True;
end;

폼 종료시 클라이언트 & 서버 작동 중지
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);begin
  TcpClient1.Active:=False;
  TcpServer1.Active:=False;
end;

접속 및 데이터 전송 부분.


접속 & 전송 소스코드
procedure TMainForm.clientRecv();begin
  Memo_Client.Lines.Add( '클라이언트 받음 : ' + TcpClient1.Receiveln() );
end;
procedure TThread0.Execute();begin
  with MainForm do begin
    while TcpClient1.Connected do begin
      while TcpClient1.WaitForData(3000) do begin
        Synchronize(MainForm.clientRecv);//쓰레드 동기화
      end;
    end;
  end;
  Thread0 := nil;
end;

procedure TMainForm.SpeedButton1Click(Sender: TObject);begin
  if TcpClient1.Connected = False then begin
    TcpClient1.Connect;
  end;
  TcpClient1.OnReceive:= TcpClient1Receive;
  if TcpClient1.Connected = True then begin
    if Thread0 = nil then begin
      Thread0 := TThread0.Create(False);//쓰레드 생성 Suspanded := False
    end;
    TcpClient1.Sendln( '데이터 ' + IntToStr(index) );
    Inc(index);
  end;
end;

TCP 클라이언트 소켓 이벤트
procedure TMainForm.TcpClient1Connect(Sender: TObject);begin
  Memo_Client.Lines.add( '클라이언트 메시지 : conneted' );
end;
procedure TMainForm.TcpClient1Disconnect(Sender: TObject);begin
  Memo_Client.Lines.add( '클라이언트 메세지 : disconnected' );
end;

procedure TMainForm.TcpClient1Send(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer);begin
  Memo_Client.Lines.Add( '클라이언트 보냄 : ' + Buf );
end;
procedure TMainForm.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer);begin
  // BUG !! 해당 동작 작동 안합
end;

클라이언트 접속 중단


서버 접속 처리
procedure TMainForm.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
var
  timeout:Cardinal;
begin
  Memo_Server.Lines.Add( '서버 메시지 : accepted - 접속 성립' );
  timeout := 0;
  while ClientSocket.Connected do begin//접속 상태
    if ClientSocket.WaitForData(3000) then begin//최대 대기시간
      with ClientSocket do begin
        Memo_Server.Lines.Add( '서버 받음 : ' + Receiveln() + ' - ' +  RemoteHost);
        Sendln( '접속 허가' );
      end;
    end else begin
      timeout := timeout +1;
      if timeout >= 10 then begin//30 초 동안 통신이 없으면 접속 중단
        ClientSocket.Disconnect;//접속 종료시 클라이언트 접속 해제가 안됨.
      end;
    end;
  end;
  Memo_Server.Lines.Add( '서버 메시지 : disconnected - ' +  ClientSocket.RemoteHost);
end;

procedure TMainForm.TcpServer1Listening(Sender: TObject);begin
  Memo_Server.Lines.Add( '서버 메시지 : listening' );
end;
Posted by Nightly Luna
,
® © Tanny Tales
/ rss