2021년 9월 12일(버전 3.1)
2021년 5월 25일 (버전 3.0)
2021년 3월 13일(버전 2.6)
2021년 2월 1일 (버전 2.5)
2020년 12월 18일 (버전 2.4)
2020년 11월 28일
2020년 10월 31일(버전 2.3)
2020년 10월 27일(버전 2.2)
2020년 10월 26일 (버전 2.1)
2020년 10월 9일
2020년 10월 6일
2020년 9월 24일
2020년 7월 16일
2020년 7월 12일
2020년 5월 3일
2020년 4월 19일
2019년 3월 31일
이러한 구성 요소를 사용하면 LAN 네트워크 또는 인터넷의 컴퓨터 간에 TCP 소켓 비동기 통신을 설정할 수 있습니다.
DzTCPServer 및 DzTCPClient는 System.Win.ScktComp 유닛의 TClientSocket 및 TServerSocket을 사용합니다. 이러한 클래스들은 델파이에서 사용 가능하지만, 버퍼 데이터를 읽고 써야 하고, 사용할 수 있는 리소스가 많지 않기 때문에 구현이 조금 어렵습니다.
사용법은 매우 간단합니다. 서버 측 앱에 서버 구성 요소를 삭제하고 클라이언트 측 앱에 클라이언트 구성 요소를 삭제하고 명령 메시지 코딩을 시작해야 합니다.
채팅 앱, 원격 명령 앱, 원격 모니터링 앱과 같은 많은 작업을 수행할 수 있으며 파일과 같은 스트림을 보낼 수도 있습니다. 하늘이 한계입니다.
캐시 구조 : Delphi 네이티브 소켓 컴포넌트를 사용하는 경우 여러 개의 메시지를 동시에 보내면 수신자가 그룹화되거나 나누어진 메시지를 받을 수 있으므로 항상 이 문제를 처리해야 합니다. DzSocket 소켓 메시지를 자동으로 제어하므로 항상 메시지당 하나의 이벤트를 수신합니다.
KeepAlive : 소켓 연결을 설정할 때 한쪽 연결이 끊어지면 새 메시지 전송을 시도할 때까지 다른 쪽 연결이 통신되지 않습니다. 따라서 수동 ping을 구현할 수 있지만 이렇게 하면 불필요한 작업이 많이 발생합니다. DzSocket 에는 네트워크 기본 연결 유지 프로토콜을 활성화하는 KeepAlive 리소스가 있습니다.
명령 : 기본 소켓을 사용하면 문자열 세그먼트를 보낼 수 있지만 명령을 보내고 연결 반대편에서 이 명령을 식별하려면 이를 수동으로 구현해야 합니다. DzSocket 사용하면 Char 명령을 항상 사용할 수 있습니다. 빠르고 쉽게 준비하세요.
서버의 자동 해제 데이터 개체 : 서버 구성 요소에서 사용할 수 있는 클라이언트 개체 목록에는 일반적으로 개체를 사용하여 클라이언트 연결에 대한 정보를 저장할 수 있는 포인터 속성이 있습니다. DzSocket 사용하면 이러한 개체 소멸에 대해 걱정할 필요가 없습니다. 이러한 개체를 관리하려면 속성을 활성화하기만 하면 됩니다.
열거자 : 기본 서버 구성 요소에는 클라이언트 목록 연결을 반복하는 열거자가 없습니다. DzSocket 사용하면 서버 구성 요소에서 직접 for .. in
수행하여 클라이언트 목록 연결을 반복할 수 있습니다.
SendAll : 모든 클라이언트에게 쉽게 명령을 보냅니다. 그 외에도 SendAllEx
사용하여 특정 클라이언트 연결을 제외한 모든 클라이언트에 명령을 보낼 수 있습니다.
연결 모니터 : 클라이언트 요청 없이 연결이 종료된 시기를 알 수 있는 연결 끊김 이벤트가 있습니다.
유니코드 지원 : Delphi 기본 구성 요소는 양쪽에서 데이터 스트림을 변환하는 코드를 직접 작성하지 않는 한 유니코드 문자열을 사용한 메시지 전송을 지원하지 않습니다. 이건 정말 지루하고 시간도 많이 걸립니다. DzSocket 사용하면 직접 메서드 매개변수를 문자열 유형으로 사용하여 메시지 텍스트를 간단히 보낼 수 있으므로 Delphi는 기본적으로 유니코드 문자를 WideString으로 간주합니다.
로그인 제어 : 간단한 이벤트를 이용하여 클라이언트 인증/권한 부여를 제어할 수 있으며, 서버에 대한 클라이언트 접근을 제어하기 위해 추가 데이터 정보를 전송할 수 있습니다.
자동 재연결 : 클라이언트 구성 요소는 연결이 끊어지면 속성을 활성화하여 서버에 자동으로 다시 연결할 수 있습니다.
그리고 훨씬 더!
델파이 XE3..델파이 11 지원
AutoFreeObjs: Boolean
(public) = 서버에서 클라이언트 소켓의 Data
속성을 사용하여 개체를 할당하는 경우 이 옵션을 활성화하면 클라이언트 소켓이 종료될 때 구성 요소가 개체 삭제를 처리하게 됩니다. 이 옵션이 활성화되고 소켓의 Data 속성이 할당되면 구성 요소는 항상 Data를 개체로 가정합니다.
EnumeratorOnlyAuth: Boolean
(public) = for in
구성 요소 열거자를 사용할 때 바이패스 클라이언트는 아직 인증되지 않았습니다.
KeepAlive: Boolean
= KeepAlive 소켓 기본 리소스 활성화를 허용합니다. KeepAliveInterval 속성을 사용하여 연결 유지 신호를 보냅니다.
KeepAliveInterval: Integer
= KeepAlive 간격을 밀리초 단위로 지정합니다(기본값 15000/15 초 ).
Port: Word
= 서버 수신 TCP 포트를 지정합니다. 이 속성은 서버 소켓을 시작하는 데 필요합니다.
Connection[Index: Integer]: T DzSocket
(public) = T DzSocket 클라이언트 연결 객체를 Index별로 반환합니다.
Count: Integer
(공개) = 클라이언트 연결 목록 개수를 반환합니다.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
이 이벤트는 클라이언트가 서버에 연결될 때 트리거됩니다. Socket
매개변수는 클라이언트 소켓입니다.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
이 이벤트는 클라이언트가 서버에서 연결을 끊을 때 트리거됩니다. Socket
매개변수는 클라이언트 소켓입니다.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
이 이벤트는 클라이언트 연결에 오류가 발생할 때 트리거됩니다. Socket
매개변수는 클라이언트 소켓입니다.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
이 이벤트는 클라이언트가 서버에 메시지를 보낼 때 트리거됩니다. Socket
매개변수는 클라이언트 소켓입니다.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
이 이벤트는 클라이언트가 서버에 방금 연결되었을 때 트리거됩니다. 클라이언트 측에서 OnLoginRequest
가 처리되는 경우 전송된 데이터 정보는 여기에서 RequestData
매개변수로 수신됩니다. Accept
매개변수(초기 기본값은 True)를 변경하여 클라이언트 연결을 수락하거나 거부할 수 있습니다. 그 외에도 ResponseData
매개변수를 사용하여 일부 데이터 정보를 클라이언트에 보낼 수 있습니다. 허용된 플래그 및 데이터 정보는 OnLoginResponse
이벤트에서 클라이언트에 의해 수신됩니다. Accept
매개변수가 True로 유지되면 소켓 Auth
속성이 True로 설정됩니다. 그렇지 않으면 서버에 의해 클라이언트 연결이 끊어집니다.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
이 이벤트는 클라이언트가 서버에 승인된 직후에 트리거됩니다. 로그인 이벤트를 사용하지 않더라도 클라이언트가 서버에 대한 권한을 부여받은 후에만 클라이언트가 메시지를 보낼 수 있다는 점을 기억하십시오. 그렇지 않으면 서버는 클라이언트 메시지를 무시합니다.
procedure Open ;
서버 청취 소켓 포트를 켜십시오.
procedure Close ;
서버 청취 소켓 포트를 끄십시오.
procedure Lock ;
procedure Unlock ;
연결 목록을 반복할 때 연결이 닫힐 수 있으므로 이러한 메서드를 사용하여 연결 목록(스레드 안전)을 반복합니다.
예:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
또한 TDzTCPServer 구성 요소에는 연결 목록을 가리키는 기본 열거자가 있어 T DzSocket 개체가 생성됩니다. 따라서 이전 예제와 마찬가지로
for .. in
문을 사용하여 연결 목록을 반복할 수 있습니다.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Socket
매개변수로 지정된 클라이언트 소켓에 명령과 메시지를 보냅니다. 클라이언트가 수신할 명령 문자를 지정하려면 Cmd
매개변수를 사용해야 합니다. A
매개변수는 선택사항이며 메시지 텍스트를 지정할 수 있습니다.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
인증된 모든 클라이언트에게 메시지를 보냅니다.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Exclude
매개변수로 지정된 클라이언트를 제외하고 인증된 모든 클라이언트에게 메시지를 보냅니다.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
소켓 핸들 ID로 T DzSocket 개체를 반환합니다.
function GetAuthConnections : Integer;
인증된 연결 수만 검색합니다.
AutoReconnect: Boolean
= 활성화되면 클라이언트와 서버의 연결이 끊어지면 소켓이 자동으로 다시 연결을 시도합니다.
AutoReconnectInterval: Integer
= 새로운 재연결 시도를 기다리는 시간을 밀리초 단위로 지정합니다(기본값 10000/10 초 ).
AutoReconnectAttempts: Integer
= 연결이 끊어진 후 재연결을 시도하는 횟수입니다. 무한히 재시도하려면 값을 0
으로 남겨두세요.
KeepAlive: Boolean
= KeepAlive 소켓 기본 리소스 활성화를 허용합니다. KeepAliveInterval 속성을 사용하여 연결 유지 신호를 보냅니다.
KeepAliveInterval: Integer
= KeepAlive 간격을 밀리초 단위로 지정합니다(기본값 15000/15 초 ).
Host: String
= 서버에 연결할 IP 또는 호스트 이름(DNS)을 지정합니다. 이 속성은 서버 소켓에 연결하는 데 필요합니다.
Port: Word
= 서버가 수신 중이거나 포트가 매핑된 클라이언트 연결 TCP 포트를 지정합니다. 이 속성은 서버 소켓에 연결하는 데 필요합니다.
Connected: Boolean
(public) = 연결이 설정된 경우 true를 반환합니다.
SocketHandle: TSocket
(공개) = 연결의 소켓 핸들 ID를 반환합니다.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
이 이벤트는 클라이언트가 서버에 연결을 설정할 때 트리거됩니다.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
이 이벤트는 클라이언트와 서버 간의 연결이 끊어지면 트리거됩니다. 이는 클라이언트 자체의 연결 끊기 명령 없이 연결이 닫힌 것을 클라이언트가 감지한 경우 발생합니다.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
이 이벤트는 연결이 끊어지더라도 클라이언트가 서버에서 연결을 끊을 때 트리거됩니다. WasConnected
사용하면 OnDisconnect 이벤트가 설정된 연결에서 발생했는지 알 수 있습니다. 연결을 시도하고 연결이 성공적으로 설정되지 않은 경우에도 이 이벤트가 발생하기 때문입니다.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
이 이벤트는 클라이언트 연결에 오류가 발생할 때 트리거됩니다. 항상 이 이벤트를 설정하는 것이 좋습니다. 그렇지 않으면 구성 요소에서 제어할 수 없는 비동기 오류가 발생합니다.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
이 이벤트는 클라이언트가 서버로부터 메시지를 수신할 때 트리거됩니다.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
이 이벤트는 클라이언트가 서버에 연결된 직후에 트리거됩니다. 이는 서버가 로그인 데이터 정보를 요청하고 있으므로 이 데이터를 확인하고 클라이언트 연결을 수락하거나 끊을 수 있음을 의미합니다. 서버에서 이 정보를 처리하려면 Data
매개변수를 입력해야 합니다.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
이 이벤트는 서버가 클라이언트 연결을 수락하거나 거부할 때 트리거됩니다. 이 결과를 Accepted
매개변수로 확인할 수 있으며, 서버는 Data
매개변수로 일부 데이터 정보를 클라이언트에 보낼 수 있습니다.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
AutoReconnectInterval
밀리초 후에 AutoReconnect
속성이 활성화되고 연결이 끊어지면 발생합니다. 재연결 시도가 실패하면 연결이 설정될 때까지 이벤트가 연속적으로 트리거됩니다. 재연결 이벤트에서 Cancel
속성을 True
로 변경하거나 StopReconnection
메서드를 호출하여 재연결 시도를 취소할 수 있습니다.
procedure Connect ;
서버에 연결합니다.
procedure Disconnect ;
서버와의 연결을 끊습니다.
procedure StopReconnection ;
AutoReconnect
가 활성화되고 연결이 끊어지면 재연결 시도를 중지합니다.
procedure Send ( const Cmd: Char; const A: String = ' ' );
서버에 명령과 메시지를 보냅니다. 서버가 수신할 명령 문자를 지정하려면 Cmd
매개변수를 사용해야 합니다. A
매개변수는 선택사항이며 메시지 텍스트를 지정할 수 있습니다.
중요: 클라이언트가 이미 연결되어 있더라도 클라이언트가 아직 인증되지 않으면 서버는 메시지를 수신하지 않습니다.
Delphi XE6 이상에서만 사용 가능
서버 또는 클라이언트 소켓에서 Send
메서드를 사용하는 경우 데이터를 보낼 수 있는 String
매개변수가 있습니다. 한 번에 여러 데이터를 보내는 데 사용할 수 있는 두 가지 전역 방법이 있습니다.
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
보내는 사람:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
수화기:
procedure DzTCPServerTestClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
var MsgArray: TMsgArray;
begin
MsgArray := DataToArray(A);
ShowMessage(Format( ' Number = %d / String = %s ' , [MsgArray[ 0 ], MsgArray[ 1 ]]));
end ;
변환 함수는 내부적으로 JSON을 사용하여 부품 문자가 이스케이프되도록 하여 콘텐츠 변경 없이 배열 압축/압축 해제를 보장합니다. 따라서 변형 유형 부품의 내용에 대해 걱정할 필요가 없습니다.
데모 애플리케이션을 확인하고 인쇄 보내기 명령을 살펴보고 데이터 스트림을 보내고 받는 방법과 압축을 사용하여 통신 속도를 높이는 방법을 알아보세요.