-
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;
몇가지 기능이 동작되지 않는 점이 있음으로, 해당 버전에서는 신뢰가 안됨을 미리 표시 해둡니다.
델파이에서 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;