POST 메소드(Indy)를 사용하여 서버에 데이터를 보내는 Delphi 애플리케이션. 델파이에서 사용되는 인디 컴포넌트

Indy는 다양한 네트워크 애플리케이션을 개발할 수 있는 매우 강력한 구성 요소 패키지입니다. 이 튜토리얼에서는 TIdTCPClient 및 TIdTCPServer 구성 요소를 사용하여 클라이언트-서버 애플리케이션을 만드는 방법을 설명합니다.

우선, 이러한 구성 요소의 두 가지 중요한 장점에 주목하고 싶습니다. 그 중 가장 중요한 것은 멀티스레딩입니다. 이는 서버가 각 클라이언트에 대해 별도의 스레드를 생성한다는 것을 의미하며 이는 확실히 멀티 코어 프로세서가 있는 컴퓨터에서 서버 프로그램의 성능에 영향을 미칩니다. 두 번째 장점은 사용 편의성입니다. 간단한 클라이언트-서버 애플리케이션을 작성하려면 10~20줄의 코드면 충분합니다. 이 구성 요소 패키지는 표준 Delphi 어셈블리에 있습니다.

글을 쓰자 간단한 프로그램, 클라이언트에서 서버로 문자 메시지를 전송할 수 있습니다. 서버 생성을 시작해 보겠습니다.
양식의 "Indy Servers" 탭에서 IdTCPServer 구성 요소를 배치해 보겠습니다. 런타임 시 다음 양식의 OnCreate 이벤트에서 이 구성 요소에 대한 모든 설정을 지정합니다.
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
여기에서는 모든 것이 간단합니다. 서버가 작동할 포트를 표시하고 서버 자체를 활성화합니다.

클라이언트로부터 서버의 데이터를 수신하기 위해 특별한 이벤트 "OnExecute"가 있습니다. 이 이벤트는 다음과 같습니다.

시작하다
끝;

이벤트 내용을 다음과 같이 편집해 보겠습니다.
절차 TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:문자열; // 우리가 받을 문자열 변수
시작하다
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
끝;

이제 서버에 메시지가 도착하자마자 이를 문자열 변수 l에 쓰고 여러 줄의 텍스트 필드에 출력합니다.

이로써 서버 생성이 종료되는 것은 당연합니다. 인디가 우리를 위해 나머지 작업을 수행할 것입니다. 클라이언트 프로그램부터 시작해 보겠습니다. 서버에 연결하여 메시지를 보내고 서버와의 연결을 끊습니다.

만들어 보자 새 프로젝트, "Indy Clients" 탭에 있는 양식에 IdTCPClient 구성 요소를 배치합니다. 또한 간단한 편집과 버튼도 배치하겠습니다. 버튼에 대한 OnClick 이벤트 핸들러를 생성해 보겠습니다. 내부에는 다음과 같이 작성할 것입니다.
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

이 코드는 OnCreate 이벤트에 배치될 필요가 없습니다. 원한다면 이 코드를 원하는 곳에 배치할 수 있습니다.
첫 번째 줄에서 포트를 할당하고 서버 프로그램에서 지정한 것과 동일한 포트를 지정해야 합니다. 그렇지 않으면 클라이언트가 서버를 찾을 수 없습니다. 그런 다음 서버의 IP 주소를 나타냅니다. 서버 자체는 다음 중 하나에 위치할 수 있습니다. 지역 네트워크, 그리고 원격으로. 후자의 경우 인터넷을 통해 연결되며 인터넷에서 IP 주소를 지정해야 합니다.

주소를 "127.0.0.1"로 지정했는데, 이는 서버가 클라이언트가 실행 중인 컴퓨터임을 의미합니다. 이 방법은 네트워크 애플리케이션을 테스트하는 데 매우 편리합니다.
그런 다음 연결하고 메시지를 보낸 다음 연결을 끊습니다. 메시지 자체와 마찬가지로 편집이나 문자열 변수에서 IP 주소를 가져올 수도 있습니다.

클라이언트 프로그램 작업도 완료되었습니다. 보시다시피 Indy는 우리를 위해 엄청난 일을 해 주므로 경험이 없는 프로그래머라도 자신만의 네트워크 애플리케이션을 만들 수 있습니다.

UDP 프로토콜은 전송에 매우 좋습니다. 문자 메시지, 즉, 지역 채팅 등을 구성할 수 있습니다. 저는 Delphi에서 UDP를 사용한 가장 간단한 작업의 예를 제시하기로 결정했습니다.

단계별 지침:

예를 들었지만 용서하세요. 모든 줄을 적지 않았습니다. 왜냐하면 ... 나는 복잡한 것을 보지 못하고 누구나 알아낼 수 있습니다.

사실, 불분명한 점이 있으면 나에게 질문해도 됩니다. 실제 코드는 다음과 같습니다.

용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화 상자, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

유형
TForm1 = 클래스(TForm)
IdUDPClient1: TIdUDP클라이언트;
IdUDP서버1: TIdUDP서버;
버튼1: T버튼;
라벨1: TLabel;
절차 FormCreate(보내는 사람: TObject);
절차 FormClose(Sender: TObject; var Action: TCloseAction);
절차 Button1Click(보내는 사람: TObject);
프로시저 IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
바인딩: TIdSocketHandle);
사적인
(개인 선언)
공공의
(공개 선언)
끝;

var
Form1: TForm1;

($R *.dfm)
[b]//메시지 전송 절차
절차 TForm1.Button1Click(Sender: TObject);
시작하다
노력하다
IdUDPClient1.Active:= 참;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
IdUDPClient1.Connected인 경우
시작하다
IdUDPClient1.Send(TimeToStr(시간));
Label1.Caption:= "확인";
끝;
IdUDPClient1.Active:= 거짓;
삐;삐;삐;
제외하고
MessageDlg("문제가 발생했습니다 =(", mtError, , 0);
끝;
끝;
[비]
//켜짐 꺼짐. 양식을 시작하고 닫을 때 UDP 서버
절차 TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
시작하다
IdUDPServer1.Active:= 거짓;
끝;

절차 TForm1.FormCreate(Sender: TObject);
시작하다
IdUDPServer1.Active:= 참;
끝;

[b]//데이터 수신 시 서버 반응 절차
절차 TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TBytes; 바인딩: TIdSocketHandle);
바르
i:정수;
s:문자열;
시작하다
s:= "";
노력하다
나는:= 0;
while (AData[i] 0) 수행
시작하다
s:= s + chr(AData[i]);
나는:= 나는 + 1;
끝;
마지막으로
Label1.Caption:= s;
끝;
끝;

세르주 도슈코프 마이크 팜

이 기사에서는 Indy 키트와 Delphi 7을 사용하여 독립형 웹 서비스를 생성하는 방법과 Indy 키트를 사용하여 Delphi 7 SOAP 기반 웹 서비스를 지원하는 방법을 보여줍니다. 뒤에 추가 정보웹 서비스 작성에 대한 자세한 내용은 Borland 커뮤니티 사이트인 Shakespeare on the Web에 있는 Nick Hodges의 훌륭한 기사를 참조하십시오.

조만간 독립형 HTTP 서버이고 웹 서비스를 지원하는 서버를 만들어야 할 수도 있습니다. 예를 들어, Delphi를 사용하여 구축된 n 계층 애플리케이션을 위한 SOAP 기반 애플리케이션 서버를 생성할 수 있습니다.

소개

Delphi의 온라인 도움말은 탁월한 기능을 제공합니다. 순차적 지시웹 서비스, MIDAS 서버(COM, DCOM 모델)를 만드는 방법에 대해서는 설명하지만 SOAP 프로토콜을 기반으로 독립 실행형 n 계층 MIDAS 응용 프로그램을 만드는 방법에 대한 정보는 사실상 없습니다.

이전에는 Dave Nottage가 출판했습니다. 이 기사에서는 SOAP 지원 및 Datamodule의 SOAP 인터페이스 게시 기능을 사용하여 Delphi 6에서 웹 서비스를 생성하는 방법에 대한 아이디어를 설명했습니다. 즉, 이 기사를 통해 자신만의 n 계층을 생성하는 방법을 배울 수 있었습니다. 마이다스 시스템.

Borland의 Delphi 7과 새로운 Indy 키트에는 이 기능이 내장되어 있습니다.

그러나 기본 제공 지원에도 불구하고 이 기능은 문서화되어 있지 않습니다.

Borland 네트워킹 컨퍼런스의 최근 게시물과 Google 서버를 사용한 웹 검색을 통해 작성자는 기존 코드를 Delphi 6에서 Delphi 7로 변환하는 방법을 개발할 수 있었습니다. 그러나 모든 것에는 시간이 있습니다.

주요 아이디어

이 기사는 3부작 시리즈의 첫 번째 기사입니다. 주요 조항을 설명합니다. 두 번째와 세 번째 부분에서는 몇 가지 문제와 해결 방법을 다룹니다. 주요 아이디어를 설명하기 시작하겠습니다.

  • 독립형 HTTP 서버가 되어야 합니다.
  • 인디를 플랫폼으로 사용합니다.
  • SOAP 프로토콜을 통한 게시 지원;
  • SOAP/HTML을 기반으로 자신만의 n 계층 서버를 생성할 수 있는 SOAP 데이터 모듈을 게시할 수 있어야 합니다.

HTTP 서버와 SOAP

많은 사람들이 Indy를 알고 있으며 이전에 THTTPServer 구성 요소를 사용해 본 적이 있습니다. 이 구성 요소를 신청서에 넣는 것은 쉽지만 SOAP를 지원하려면 어떻게 해야 할까요? "C:Program FilesBorlandDelphi7SourceIndy" 디렉터리에서 IdHTTPWebBrokerBridge.pas 파일을 찾을 수 있습니다. 이것이 바로 당신에게 필요한 것입니다.

이 파일은 Indy 실행 파일의 일부가 아니므로 현재 프로젝트에 표준 프로젝트 파일로 포함해야 합니다. (프로젝트를 컴파일하려면 IdCompilerDefines.inc 파일도 필요합니다.) 이 파일은 현재 프로젝트 디렉터리에 복사되어야 합니다. 속도를 높이려면 코드 변경이 필요할 수 있으므로 이러한 파일을 Indy 배포판과 별도로 보관하는 것이 가장 좋습니다.

다음은 TIdHTTPWebBrokerBridge라는 SOAP 패킷을 지원하도록 확장된 THTTPServer의 대체 구성 요소 구현에 대해 설명합니다. 이 구성은 TCustomHTTPServer에서 상속되고 기본 요청 바인딩을 지원하는 클래스입니다.

이 클래스는 팔레트에서 액세스할 수 없으므로 코드를 실행할 때 이를 일반 객체로 정의해야 합니다.

이 개체는 SOAP 작업을 활성화하는 추가 속성을 제외하고 일반 THTTPServer와 정확히 동일한 방식으로 사용할 수 있습니다.
하지만 먼저 필요한 코드를 준비하는 방법을 살펴보겠습니다.

웹브로커와 인디

이전에 웹 서비스를 만들어 본 적이 있는 사람들은 다음을 사용한다는 것을 알고 있을 것입니다. 웹브로커. Delphi 6과 마찬가지로 Delphi 7은 WebBroker 아키텍처를 사용하여 SOAP를 지원합니다.

그러므로 모듈을 생성해야 합니다. TWeb모듈그 안에 THTTPSoapDispatcher, THTTPSoapPascalInvoker 및 TWSDLHTMLPublish의 세 가지 구성요소를 배치합니다. 이들 모두는 컴포넌트 팔레트의 WebServices 탭에서 사용할 수 있습니다. SOAPDispatcher를 SOAPPascalInvoker와 연결하면 신청서가 준비됩니다. 최종 결과는 다음 그림과 유사해야 합니다.

(uWebModule.pas 모듈)

이 양식에 대한 사용자 정의 코드를 변경하거나 실행할 필요가 없으므로 모든 것을 그대로 두는 것이 가장 좋습니다.

웹모듈과 인디

HTTP 서버를 구현하는 데 필요한 코드의 다른 부분으로 넘어가겠습니다.

보시다시피 TIdHTTPWebBrokerBridge에는 RegisterWebModuleClass 메서드가 있습니다. 이를 통해 자신의 WebModule을 등록하고 서버에서 사용할 수 있게 만들 수 있습니다.

따라서 fServer 서버 객체를 생성한 후 fServer.RegisterWebModuleClass(TwmSOAPIndy) 클래스를 호출하기만 하면 됩니다.

메모. TIdHTTPWebBrokerBridge의 일반적인 구현에서는 요청이 수신될 때마다 TwmSOAPIndy 객체가 생성됩니다. 분명히 이것은 필요하지 않습니다. 따라서 클래스를 수정하여 영구적인 생성을 제공할 수 있습니다. 이 개체의서버 객체가 존재하는 한. 자세한 내용은 클래스 구현 문서를 참조하는 것이 좋습니다.

서버가 준비됐나요?

Delphi 6에서 사용되는 인디 구성 요소.

기본 인터넷 서비스 및 프로토콜 외에도 인터넷 개발자가 자주 사용하는 기능인 다양한 추가 서비스가 있습니다. 또한 브라우저를 사용하여 정보를 표시하는 기능이 항상 인터넷 애플리케이션에 적합한 솔루션은 아닙니다. 이 경우 데이터 교환을 위해 인터넷 인프라를 사용하고 Delphi 등에서 개발된 보다 복잡한 클라이언트 애플리케이션을 통해 정보 표시를 제공하는 것이 합리적입니다.

표준 웹 서버에 포함되지 않은 특수한 서버 로직을 구현해야 한다고 가정해 보겠습니다. 이러한 종류의 문제를 해결하기 위해 Delphi에는 Nevrona Designs(http://www.nevrona.com/Indy/)의 Internet Direct(Indy) 라이브러리가 포함되어 있습니다. Borland Delphi용으로 특별히 개발된 이 라이브러리에는 이미 8가지 버전이 있으며, 그 중 최신 버전이 새로운 버전델파이. 구성 요소 세트는 클라이언트(Indy 클라이언트), 서버(Indy 서버) 및 보조(Indy Misc)의 세 그룹으로 나뉩니다.

인디 클라이언트와 인디 서버

다수 인디 구성 요소클라이언트 및 인디 서버는 프로토콜 및 서비스의 클라이언트 및 서버 부분에 해당하는 쌍이며(TunnelMaster 및 TunnelSlave와 같은 주로 서버 기반 구성 요소인 개별 제외) TCP/IP, UDP, NNTP, SMTP, FTP, HTTP 및 ECHO, FINGER, WHOIS 등의 서비스.

인디 클라이언트 구성 요소는 소켓을 사용하여 작성됩니다. 클라이언트 측 소켓에는 서버에 대한 연결이 필요합니다. 연결이 설정되면 클라이언트와 서버는 메시지 교환을 시작할 수 있습니다. 이러한 메시지는 성격이 다르지만 일반적으로 특정 프로토콜(예: HTTP)을 사용하여 교환이 이루어집니다.

TIdTCPClient 및 TIdTCPServer

이러한 구성 요소는 주요 네트워크 프로토콜 중 하나인 TCP(전송 제어 프로토콜)를 지원하는 데 사용되며 TIdSMTP 및 TIdFTP 구성 요소의 기본 클래스이기도 합니다. TIdTCPServer 클래스에는 기본값이 nil인 ThreadMgr 속성이 있습니다. TIdTCPServer가 활성화되었을 때 ThreadMgr이 nil이면 TIdThreadMgrDeafault 클래스가 암시적으로 생성됩니다. 그렇지 않으면 설치된 프로세스 관리자가 사용됩니다.

TIdUDPClient 및 TIdUDPServer

이러한 구성 요소는 지원하는 데 사용됩니다. 네트워크 프로토콜 UDP(사용자 데이터그램 프로토콜)이며 또한 다른 여러 Indy 구성 요소의 기본 클래스이기도 합니다.

TIdChargenServer

구성 요소는 일반적으로 테스트 목적으로 임의의 기호를 생성하는 데 사용됩니다.

TIdDayTime 및 TIdDayTimeServer

구성 요소는 시간 서비스를 제공하는 데 사용됩니다. 클라이언트가 요청하고 서버는 현재 날짜와 시간을 보고합니다.

TIdDNSResolver

이는 DNS(도메인 이름 서비스) 서버의 요청을 처리하는 클라이언트 구성 요소입니다. DNS 서버 쿼리는 컴퓨터 이름을 IP 주소로 바꾸도록 설계되었습니다. TIdDNSResolver는 TIdUDPClient 클래스의 자손입니다.

TidDICT서버

클라이언트가 자연어 사전에 액세스할 수 있도록 하는 TCP 프로토콜 기반의 서버 측 사전인 DICT(사전 서버 프로토콜)를 지원하는 서버 구성 요소입니다.

TIdDISCARD서버

레코드 서버를 지원하는 서버 구성 요소입니다. 녹음 내용은 디버깅 및 측정 도구로 사용될 수 있습니다. 기록 서비스는 데이터를 받기를 원하는 사람에게 데이터를 넘겨주기만 하면 됩니다.

TI dEcho 및 TI dECHOServer

구성 요소는 일반적으로 네트워크 상태를 확인하는 데 사용되는 응답 서비스를 제공하도록 설계되었습니다. 클라이언트가 서버에 문자 메시지를 보내고, 서버는 해당 메시지를 클라이언트에 반환합니다. 메시지가 왜곡되면 네트워크가 오작동합니다.

TIdFinger 및 TIdFingerServer

구성 요소는 사용자가 시스템에 있는 다른 사용자의 존재에 관한 데이터를 쿼리할 수 있는 프로토콜을 제공하도록 설계되었습니다. 일부 서버는 이러한 클라이언트 요청을 처리합니다. 이 구성 요소 쌍을 사용하면 시스템에 다른 사용자가 있는지 확인하는 클라이언트 요청을 처리할 수 있습니다.

이 구성 요소에는 파일 전송 프로토콜인 FTP(파일 전송 프로토콜)에 대한 전체 지원이 포함되어 있습니다. 수동 및 활성 데이터 전송은 물론 GET 및 PUT, 디렉터리 삭제, 할당량 획득, 파일 및 디렉터리 크기와 같은 작업도 지원됩니다. TI dFTP는 TIdSimpleServer 클래스를 사용하여 작동합니다. FTP 파일 전송이 진행 중일 때 데이터 전송을 위해 보조 TCP 연결이 열리고 데이터 전송이 완료되면 닫힙니다. 이 연결을 "데이터 링크"라고 하며 전송되는 각 파일마다 고유합니다.

TIdGopher 및 TIdGopherServer

이러한 구성 요소는 대체된 네트워크 프로토콜을 제공하도록 설계되었습니다. 최근에 WWW에서 ( 월드와이드웹) HTTP 프로토콜. 이 프로토콜을 구현하는 서버는 계층적 분산 문서 흐름 지원 시스템을 제공합니다. DemosindyGopherClient 및 Demosindy GopherServer 디렉터리에 있는 이 구성 요소 쌍을 사용하는 예는 이 프로토콜을 사용하여 닫힌 파일을 포함하여 컴퓨터에 있는 파일에 대한 정보를 로컬 네트워크에 제공할 수 있는 방법을 보여줍니다.

TIdHostNameServer

로컬 서버 이름을 클라이언트에 전달하도록 설계된 서버 구성 요소입니다.

TIdHTTP 및 TIdHTTPServer

구성 요소는 HTTP 네트워크 프로토콜을 제공하는 데 사용됩니다(GET, POST 및 HEAD 작업을 포함하여 버전 1.0 및 1.1이 지원됨). 또한 인증 및 프록시 서버 사용에 대한 지원도 제공됩니다. 서버 구성 요소는 특정 프로토콜을 지원하는 다른 웹 서버에 서비스를 제공하는 데 사용됩니다. TIdHTTPServer는 쿠키, 상태 관리 등과 같은 기능의 구현을 용이하게 합니다.

TIdIcmp클라이언트

ping 작업 및 네트워크 추적을 수행하는 데 사용되는 ICMP(인터넷 제어 메시지 프로토콜)를 제공하도록 설계된 클라이언트 구성 요소입니다.

MIME 인코딩 및 디코딩, 멀티바이트 문자 전송 지원을 포함하여 POP(Post Office Protocol)을 제공하도록 설계된 클라이언트 구성 요소입니다.

TIdIMAP4서버

서버에서 IMAP(인터넷 메시지 액세스 프로토콜) 작업을 지원하도록 설계된 서버 구성 요소입니다. 프로토콜을 사용하면 메시지를 검색할 수 있습니다. 이메일서버에서. IMAP과 POP 프로토콜의 차이점은 POP 프로토콜에는 다음이 필요하다는 것입니다. 추가 메모리데이터를 저장하고 IMAP 프로토콜은 클라이언트 시스템 대신 서버에 액세스합니다. IMAP4는 POP3를 대체하기 위해 만들어졌지만 POP3는 오늘날까지도 널리 사용되는 표준으로 남아 있습니다.

TidIRC서버

일반적으로 채팅이라고 하는 인터넷에서 가장 일반적으로 사용되는 서비스 작업을 지원하도록 설계된 서버 구성 요소입니다. 구성 요소는 기본 제공 빌딩 블록 IRC(인터넷 릴레이 채팅) 서버용입니다.

TIdMappedPortTCP

프록시 서버에서 자주 사용되는 매핑된 포트를 생성하도록 설계된 서버 구성 요소입니다. 이 구성 요소의 방법을 사용하면 한 포트를 다른 포트에 매핑할 수 있습니다. 예를 들어, 포트 80은 포트 3000에 매핑될 수 있으며 첫 번째 포트(포트 80)에 대한 모든 요청은 두 번째 포트(포트 3000)로 전달됩니다.

TIdNNTP 및 TIdNNTP서버

이러한 구성 요소는 뉴스 서비스에 사용되는 NNTP(Network News Transfer Protocol)를 지원하는 데 필요합니다. 클라이언트 구성 요소에는 MIME 인코딩 및 디코딩에 대한 지원뿐만 아니라 멀티바이트 문자 및 대체 인코딩에 대한 지원도 포함됩니다. 서버 구성 요소를 사용하면 뉴스 서버를 만들 수 있습니다. TIdNNTPServer는 모든 기능을 갖춘 뉴스 서버가 아니라 그러한 서버에 대한 기본 기능을 제공하는 구성 요소라는 점에 유의하는 것이 중요합니다.

TIdQOTD 및 TIdQOTDServer

구성 요소는 오늘의 명언 서비스를 제공하는 데 사용됩니다. 클라이언트 구성 요소는 일일 견적을 얻기 위해 서버 구성 요소 인스턴스에 연결합니다. 각 서버 인스턴스에는 고유한 인용 데이터베이스가 포함되어 있습니다.

인증, MIME 인코딩 및 디코딩, 멀티바이트 문자 지원을 지원하는 SMTP(Simple Mail Transfer Protocol) 애플리케이션에 사용하도록 설계된 클라이언트 구성 요소입니다.

시간 서비스인 SNTP(Simple Network Time Protocol)를 제공하도록 설계된 클라이언트 구성 요소입니다. 결정하기 위해 언제든지 서비스에 연결하는 데 사용할 수 있습니다. 현재 날짜그리고 시간.

TIdSimpleServer

경량 TCP 서버를 제공하는 서버 구성 요소입니다. 지점 간 연결을 구성할 수 있습니다. 단일 사용자로 서버를 만드는 데 사용됩니다. 즉, 한 번에 하나의 연결만 제공할 수 있습니다. TIdTCPServer 구성 요소와 달리 클라이언트의 요청을 기다리고 이러한 요청을 처리할 때 보조 프로세스를 생성하지 않습니다. 즉, 서버가 클라이언트의 요청을 처리하고 있을 때 다른 클라이언트가 연결을 위해 연결하는 경우 첫 번째 요청 처리가 끝날 때까지 서버가 차단됩니다.

TIdTelnet 및 TIdTelnetServer

클라이언트 구성 요소는 콘솔 협상 및 인증을 포함하여 다른 컴퓨터에서 원격 세션을 구성하는 데 사용됩니다. 통신 프로토콜은 서버와 대화식으로 상호 작용하는 사람이 있다고 가정합니다. 클라이언트 구성 요소에는 디스플레이 지원이나 터미널 에뮬레이션이 없지만 단순히 서버 부분에 대한 연결만 제공합니다. 일반적으로 TIdTelnetServer 서버 프로토콜은 클라이언트와의 대화형 상호 작용을 위해 텍스트 인터페이스로 원격 데이터베이스를 구성하는 데 사용됩니다.

TIdTime 및 TIdTimeServer

클라이언트 구성 요소는 시간을 결정하기 위한 TIdSNTP 구성 요소의 대안입니다. 두 프로토콜의 형식이 다르다는 점에 유의하는 것이 중요합니다. TIdTime은 RFC 868 형식을 기반으로 합니다(필요한 모든 변환을 수행하여 내부 UNIX OS 표준으로 시간을 반환합니다). 서버 구성 요소는 DayTime 서버와 기능이 유사합니다. 시간 서비스를 구현하는 데 사용할 수 있습니다. 로컬 컴퓨터. 추가 코드는 필요하지 않습니다. 서버 컴퓨터의 내부 시계 시간을 반환하는 TIdTimeServer 인스턴스를 만들기만 하면 됩니다.

TIdTrivialFTP 및 TIdTrivialFTPServer

이러한 구성 요소는 간단한 파일 전송 프로토콜을 구성하는 데 필요합니다. 이 프로토콜의 클라이언트 구성 요소는 해당 서버 구성 요소의 인스턴스에 연결하는 데 사용됩니다. 이 프로토콜은 근거리 통신망에서나 라우팅 테이블을 라우터에 로드(업로드)하는 등 개인적이고 가벼운 로컬 파일 전송 사례를 위해 만들어졌습니다. 이 프로토콜의 약한 특성으로 인해 인증 알고리즘이나 기타 보안 메커니즘을 사용할 때는 사용하지 않는 것이 좋습니다. 이 프로토콜의 주요 목적은 파일을 수정하기 위해 하드웨어 장치로 파일을 전송하는 것입니다.

TidTunnelMaster 및 TidTunnelSlave

서버 터널 구성 요소는 프록시 서버에서 하나의 물리적(터널)을 통해 여러 논리적 연결을 구성하는 데 사용됩니다. 이러한 클래스는 예를 들어 비밀이 아닌 채널을 통해 비밀 연결을 구성하는 등 다양한 목적으로 사용될 수 있습니다.

TIdWhois 및 TIdWhoIsServer

이 클라이언트 구성 요소는 표준 Whois 서버에 연결되어 도메인에 대한 정보를 얻을 수 있습니다. 서버 구성 요소는 NIC 서버의 기본 기능을 제공합니다.

인디 기타

Indy 기타 구성요소 팔레트 페이지에는 BASE64, UUE, Quoted Printable 및 기타 일반적인 이메일 통신 형식, 비밀번호 저장에 사용되는 암호화 표준용 인코더(MD2, MD4 및 MD5)가 포함되어 있습니다. 전자 서명되돌릴 수 없는(해독하기 어려운) 형식으로 되어 있으며 인터넷 애플리케이션 개발에 자주 사용되는 기타 유용한 구성 요소 및 유틸리티도 많이 있습니다.

TidAntiFreeze

Indy 구성요소의 블록 기반 알고리즘으로 인해 연결이 작동하는 동안 애플리케이션이 중단되는 경우가 종종 있습니다. 애플리케이션이 정지되는 것을 방지하기 위해 통신을 구성할 때 보조 프로세스(스레드)의 사용을 제거하려면 지정된 구성 요소를 양식에 배치하는 것으로 충분합니다.

구성 요소는 TCP/IP 프로토콜 스택의 요청을 구문 분석하고 외부 연결이 차단될 때 지연되는 동안 애플리케이션에 메시지를 보내는 방식으로 작동합니다. 이는 코드가 실행되는 것처럼 보이게 합니다. 구성 요소는 기본 프로세스에 대해서만 차단된 연결에 영향을 미치므로 응용 프로그램의 보조 프로세스에서는 TIdAntiFreeze를 사용할 필요가 없습니다. TIdAntiFreeze 구성 요소는 메시지를 처리하기 위해 기본 프로세스가 주기적으로 중단되므로 연결 속도가 느려진다는 점을 명심하세요. 따라서 개발 중인 애플리케이션이 OnClick, OnPaint, OnResize 등을 포함하여 메시지를 처리하는 데 너무 많은 시간을 소비하지 않도록 주의해야 합니다. 이는 TIdAntiFreeze 클래스의 속성을 통해 어느 정도 제어할 수 있습니다. 이 구성 요소의 사용은 필수는 아니지만 연결을 애플리케이션의 시각적 인터페이스와 동기화하는 문제를 해결할 수 있습니다.

TIdDateTimeStamp

인터넷 프로토콜이 다른 날짜 및 시간 형식을 사용한다는 사실과 관련된 날짜 및 시간 계산을 수행하는 클래스입니다. 또한 클라이언트와 서버가 서로 다른 시간대에 위치할 수도 있습니다.

TidIP시계

컴퓨터 IP 주소의 변경 사항을 지속적으로 모니터링하는 타이머 기반 구성 요소입니다. 구성 요소 이벤트는 변경 사항이 감지되면 발생합니다. 이 구성 요소는 일반적으로 컴퓨터가 인터넷이나 다른 네트워크에 연결되어 있는지 여부를 감지하는 데 사용됩니다. 이 상황에서 IP 주소가 변경되는 것은 새 네트워크에 연결할 때 DHCP(동적 호스트 구성 프로토콜) 서버에서 IP 주소를 할당하기 때문에 발생할 수 있습니다.

TIdLog디버그

이 구성 요소의 목적은 클라이언트 또는 서버 구성 요소의 이벤트를 가로채고 이벤트 기록을 지정된 파일. 이 구성 요소는 Indy 구성 요소를 디버깅하는 데 매우 유용합니다.

Tid메시지

구성 요소는 메시지를 적절하게 해독하거나 인코딩하기 위해 다른 구성 요소와 함께 사용됩니다. 이는 POP, SMTP 및 NNTP 구성 요소일 수 있습니다. 이 클래스는 MIME 암호화 및 암호 해독, 멀티바이트 문자 및 ISO 인코딩을 지원합니다.

TIdNetwork계산기

애플리케이션을 구축할 때 사용할 수 있는 몇 가지 Indy 구성 요소 중 하나입니다. 네트워크 계산기를 사용하여 네트워크 마스크, 서브넷, 네트워크 클래스 등을 포함한 IP 주소에 대한 계산을 수행할 수 있습니다.

TIdThreadMgr기본값

구성 요소는 기본적으로 보조 프로세스에 대한 제어를 제공합니다. 프로세스 관리를 지원하는 Indy 구성 요소에 TIdThreadManager 클래스의 인스턴스가 정의되어 있지 않을 때 생성됩니다. 구성 요소는 보조 프로세스를 관리하기 위한 기본 기능(요청 시 생성 및 삭제)만 제공합니다.

TidThreadMgrPool

TIdThreadMgrDefault보다 고급 프로세스 관리 구성 요소입니다. 요청 시 프로세스를 생성하거나 삭제하는 대신 프로세스를 병합하기 때문입니다.

TIDV카드

VCard는 명함과 동등한 전자 제품이며 소유자의 개인 정보와 그래픽 데이터를 포함할 수 있습니다.

TIdIMF디코더

인터넷 메시지를 디코딩하도록 설계되었습니다. 다른 모든 인코더 구성 요소와 마찬가지로 TIdCoder 클래스의 자손입니다. TIdCoder 클래스는 1982년 8월에 제안된 ARPA 인터넷 텍스트 메시지 형식 표준 RFS-822와 1987년 12월에 제안된 USENET 메시징 표준 RFC 1036에 따라 디코딩됩니다.

이 구성 요소는 TIdCoder 클래스를 확장하여 헤더 컨텍스트별로 RFS-822 형식을 감지할 수 있도록 하고 수신 시 암호 해독 모드와 MIME 암호화 및 암호 해독 기능을 제공합니다. TIdIMFDecoder 구성 요소는 TIdMessageClient 클래스에서 수신 및 전송된 메시지를 디코딩하는 데 사용됩니다.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder를 사용하면 지정된 형식의 텍스트를 해독할 수 있습니다. 지정된 인코딩 유형을 사용하여 독립 실행형 구성 요소로 사용되어 새로운 인코딩 유형이 포함된 메시지를 전송할 수 있습니다.

TIdBase64인코더

인쇄할 수 없는 문자를 전송할 수 있는 또 다른 암호화 알고리즘을 구현합니다.

TIDUU인코더

최초의 암호화 알고리즘 중 하나인 UU 인코딩을 구현합니다. 가끔 뉴스 서비스에 기사를 보낼 때 사용됩니다.

TIdXX인코더

이 암호화 방법은 거의 사용되지 않습니다. 본질적으로 이는 동일한 UU 인코딩이지만 암호화 테이블이 다릅니다.

TIdCoderMD2

다양한 유형의 MD(Message Digest) 암호화 알고리즘을 사용하는 구성 요소입니다. 모두 셔플 기반의 단방향이며 암호 해독 알고리즘이 없습니다.

프로토콜 클라이언트 및 서버의 구성 요소는 기본 응용 프로그램(ClientSocket, ServerSocket) 및 인터넷 및 Fastnet 팔레트의 기타 구성 요소와 함께 또는 대신에 서버 및 클라이언트 인터넷 응용 프로그램을 개발하는 데 사용할 수 있습니다. Indy 구성 요소는 WebBroker 아키텍처를 사용하지 않고 소스 코드에서 직접 인터넷 프로토콜 및 서비스에 대한 낮은 수준의 지원을 구현합니다( 소스 코드첨부되어 있습니다).

TIdConnectionInterceptOpenSSL 및 TIdServerInterceptOpenSSL

두 애플리케이션 간 통신의 비밀성과 신뢰성을 보장하는 SSL 프로토콜(Secure Sockets Layer)에는 두 개의 레이어가 있습니다. TCP와 같은 다층 전송 프로토콜의 낮은 수준에서 SSL은 기록 프로토콜이며 다양한 상위 수준 프로토콜을 캡슐화하는 데 사용됩니다. SSL의 장점은 독립적인 애플리케이션 프로토콜이지만 SSL 위에 더 높은 수준의 프로토콜을 사용할 수 있다는 것입니다.

SSL은 세 가지 주요 기능인 통신 보안을 제공합니다. 기밀 연결 제공; 암호화 공개 키(수취인의 진위를 확인하는 데 사용됨) 데이터 전송 신뢰성을 지원합니다.

  • 대칭 암호화는 데이터(예: DES, RC4 등)를 암호화하는 데 사용됩니다.
  • 전자 서명비대칭 공개 키 암호화(예: RSA, DSS 등)를 사용하여 제공됩니다.
  • 통신의 신뢰성, 메시지 전송에는 MAC 계산을 사용한 MAC 수정 코드, 보안 해시 기능(예: SHA, MD5 등)을 통한 메시지 무결성 검사가 포함됩니다.

HTTP 및 서버 인증과 결합된 SSL은 다음을 제공합니다. 필요한 기능암호화하고 설정된 연결을 유지하고 웹 서버의 신뢰성을 다시 확인하는 등의 작업을 수행합니다. SSL은 데이터 전송 중에만 통신을 보호하며 다른 보안 메커니즘을 대체하지 않는다는 점을 이해하는 것이 중요합니다.

TIdConnectionInterceptOpenSSL 및 TIdServerInterceptOpenSSL 구성 요소는 SSL 프로토콜을 사용하여 클라이언트 측 및 서버 측 연결을 모두 제공합니다. TIdConnectionInterceptOpenSSL 및 TIdServerInterceptOpenSSL 구성 요소는 Delphi 6에서만 사용할 수 있고 Kylix에서는 사용할 수 없습니다. 이는 Windows 구현의 경우 운영 체제 기능을 기반으로 하는 프로토콜의 복잡성 때문입니다.

Indy 구성요소 사용의 예는 /Delphi6/Demos/Indy 디렉토리에서 찾을 수 있습니다. 전체적으로 버전 8.0의 Indy 라이브러리에는 69개의 구성 요소가 포함되어 있습니다. 버전 9.0에서는 지정된 라이브러리에 86개의 구성 요소가 포함된다고 명시되어 있습니다. 모든 구성 요소는 Delphi 6과 Kylix에 통합되어 포함되어 있어 크로스 플랫폼 애플리케이션 개발에 사용할 수 있습니다. 모든 Indy 구성요소는 멀티스레딩을 지원합니다.

Indy 구성 요소는 표에 명확하게 표시된 것처럼 인터넷 및 Fastnet 구성 요소에 있는 거의 모든 기능을 구현합니다.

Fastn et 구성 요소 인디 구성 요소 구성 요소의 목적
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket TCP/IP 프로토콜을 사용하는 두 컴퓨터(클라이언트와 서버) 간의 상호 작용
2 TNM일시간 TIdDayTime, TIdDayTimeServer 현재 시간에 대한 서버 쿼리
3 TNMEcho Tidecho, TidechoServer 응답 서버와 통신하는 데 사용됩니다.
4 TNM핑거 TIdFinger, TIdFinger서버 인터넷 검색 서버로부터 사용자에 대한 정보를 얻기 위해 사용됩니다.
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTP서버 FTP 프로토콜을 사용하여 파일 전송 제공
6 TNMHTTP TIdHTTP, TIdHTTP서버 데이터 교환에 HTTP 프로토콜 사용
7 TNMMsgServ, TNMMsg 클라이언트에서 서버로 간단한 문자 메시지를 전송하는 데 사용됩니다.
8 TNMNNTP TIdNNTP, TIdNNTP서버 뉴스 서버와의 데이터 교환 지원
9 TNMPOP3 TIdPOP3 POP3 프로토콜을 사용하여 메일 서버로부터 이메일을 수신하는 데 사용됩니다.
10 TNMSMTP TidSMTP 인터넷 메일서버를 통해 이메일을 보내기 위해 사용됩니다.
11 TNStrmServ, TNStrmServ TCP/IP 프로토콜을 사용하여 스트림에 작성된 이진 데이터를 전송합니다.
12 TNMUDP TIdUDP, TIdUDP서버 UDP 프로토콜을 사용하여 데이터 전송
13 TpowerSock, TNMGeneralServer 자신의 클라이언트(Powersock) 및 서버(NMGeneralServer)를 작성하기 위한 기반이 되는 구성 요소 캡슐화 클래스
14 TNMUU프로세서 TIdUUEncoder, TIdUUDecoder 녹음을 수행하다 바이너리 파일 MIME 또는 UUENCODE 형식으로
15 TNMURL 문자열을 다음으로 변환합니다. HTML 형식역방향 녹음을 수행합니다.

TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL과 같은 클래스는 예외입니다. 이 클래스는 사용되지 않는 프로토콜을 구현하거나 대규모 대체 클래스 그룹에 기능이 구현되어 있습니다.

그러나 이전 제품인 인터넷 및 Fastnet 구성 요소와 달리 Indy에는 데이터 트랜스코딩 및 암호화를 위한 풍부한 서버 구성 요소와 구성 요소는 물론 인증 지원(Indy 기타 팔레트)이 포함되어 있습니다. 위 표에서 볼 수 있듯이 주요 프로토콜과 서비스는 클라이언트뿐만 아니라 서버 구성 요소에서도 제공됩니다. 이는 시간 서비스, 응답 서비스, 사용자 정보 획득, HTTP, NNTP, UDP 프로토콜 및 가장 간단한 FTP 버전입니다.

Indy 컴포넌트 사용의 몇 가지 예

Delphi에 포함된 Indy 구성 요소에서 IP 주소는 일반적으로 클라이언트 애플리케이션에서만 Host 속성에 정의됩니다. 서버 호스팅 구성 요소에는 해당 포트 폴링을 시작하거나 중지할 수 있는 메서드가 있습니다. 예를 들어 IdTCPServer 구성 요소의 Active 속성을 변경하면 해당 포트 폴링이 시작되거나 중지됩니다. 클라이언트와 서버 간의 연결이 설정되면 데이터 전송이 시작될 수 있습니다.

Indy 구성 요소는 데이터 작업 시 보안과 안정성을 크게 강조합니다. 예를 들어 IdTCPClient 구성 요소에는 Connect 및 Disconnect 메서드가 있습니다. 클라이언트 측에서 아래 코드와 같은 프로그래밍 기술을 사용합니다.

TCPClient를 사용하여 Connect를 시작하십시오. lstMain.Items.Add(ReadLn)를 시도해 보세요. 마지막으로 연결을 끊습니다. 끝; 끝;

서버 측에서 TIdPeerThread 클래스의 AThread 인스턴스에 매개 변수로 전달된 연결 속성을 사용합니다.

AThread.Connection을 사용하여 WriteLn("Hello from Basic Indy Server server.");을 시작합니다. 연결을 끊습니다. 끝;

정상적인 연결 실행이나 올바른 오류 처리를 기대할 수 있습니다.

해당 클래스의 ReadLn 및 WriteLn 메서드에 유의하세요. 이는 표준 Pascal I/O 문과 유사합니다. 이는 대부분의 시스템 작업이 해당 파일을 읽고 쓰는 방식으로 수행되는 UNIX 프로그래밍 기술에 대한 찬사입니다.

Fastnet 구성 요소와 마찬가지로 Indy 구성 요소 클래스에는 이벤트 관리를 제공하는 데 사용할 수 있는 이벤트가 있습니다. 예를 들어, 클라이언트에 연결할 때 양식에 메시지가 표시되도록 정렬할 수 있습니다.

프로시저 TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); start lblStatus.caption:= "[ 서비스 제공 클라이언트 ]"; 끝;

Indy는 이 라이브러리에 고유한 클라이언트 및 서버 부분으로 프로토콜을 구현하는 구성 요소를 제공합니다. TIdGopherServer 및 TIdGopher 구성 요소는 클라이언트 측의 GetExtendedMenu, GetFile, GetMenu, GetTextFile 메서드와 서버 측의 ReturnGopherItem, SendDirectoryEntry 덕분에 파일을 보는 데 도움이 됩니다. 다양한 방식, 숨김으로 표시된 디렉토리 및 다음의 디렉토리를 포함합니다. 원격 컴퓨터(dir *.* 명령이 수행하는 작업과 유사 운영 체제 MS-DOS).

IdSMTP 및 IdMessage 구성 요소를 사용하면 SMTP 프로토콜을 사용하여 메일을 보낼 수 있는 고유한 웹 응용 프로그램을 쉽게 만들 수 있습니다.

이 경우 IdMessage 클래스(Indy Misc 페이지의 23개 구성 요소 중 하나)는 이름에 따라 메시지 생성을 담당하고 IdSMTP는 메일 서버와의 연결을 구성합니다.

Indy에서 사용되는 기술은 잠금 읽기 및 쓰기 작업을 사용합니다. Indy에서 사용되는 모든 Connect 작업은 연결이 완료될 때까지 기다립니다. Indy 클라이언트 구성 요소로 작업할 때 일반적으로 다음을 수행해야 합니다.

  • 서버에 대한 연결을 요청합니다.
  • 서버에 읽기 및 쓰기 요청을 합니다(서버 유형에 따라 해당 단계는 한 번 수행되거나 여러 번 반복됩니다).
  • 서버 연결을 종료하고 연결을 끊습니다.

Indy 구성 요소는 매우 높은 수준의 추상화를 제공하도록 설계되었습니다. TCP/IP 스택의 복잡함과 세부 사항은 프로그래머가 현재 작업에 집중할 수 있도록 숨겨져 있습니다.

다음 작은 예는 일반적인 클라이언트 Bean 세션을 보여줍니다.

IndyClient를 사용하면 Host:= "zip.pbe.com";을 시작합니다. // 호출할 호스트 Port:= 6000; // Connect에서 서버를 호출하기 위한 포트; try // 여기에 코드가 입력됩니다 finally Disconnect; 끝; 끝;

예제에서는 서버와의 연결이 이루어지지 않더라도 try-finally 문을 사용하여 연결을 정상적으로 종료하도록 하겠습니다.

Indy의 서버 구성 요소는 귀하의 필요와 사용 중인 프로토콜에 따라 사용할 수 있는 다양한 서버 모델을 설명합니다.

TIdTCPServer는 가장 일반적으로 사용되는 서버 구성 요소로, 기본 애플리케이션 프로세스와 독립적인 보조 프로세스를 생성합니다. 생성된 프로세스는 다음으로부터 들어오는 요청을 기다립니다. 잠재 고객. 요청에 응답하는 각 클라이언트에 대해 개별 보조 프로세스가 생성됩니다. 유지 관리 프로세스 중에 발생하는 이벤트는 해당 프로세스의 컨텍스트와 관련됩니다.

즉, 각 클라이언트 연결에 대해 TIdTCPServer 클래스는 해당 스레드의 OnExecute 이벤트 핸들러를 호출하여 고유한 보조 스레드를 사용합니다. OnExecute 메서드의 형식 매개 변수는 생성된 스레드에 해당하는 Athread 클래스의 인스턴스에 대한 참조입니다. 이 클래스의 Connection 속성은 클라이언트 요청을 처리하기 위해 생성되는 인스턴스인 TIdTCPConnection 클래스에 대한 참조입니다. TIdTCPConnection은 연결을 통한 읽기 및 쓰기는 물론 통신 세션 설정 및 종료도 지원합니다.

UDP 프로토콜은 먼저 서버와의 연결을 설정하지 않고도 작동합니다(전송된 각 패킷은 독립적인 데이터 세트이며 더 큰 세션이나 연결의 일부가 아닙니다). TIdTCPServer는 각 연결에 대해 별도의 스레드를 생성하는 반면 TIdUDPServer는 모든 UDP 프로토콜 요청을 처리하는 기본 스레드 또는 단일 보조 스레드를 사용합니다. TIdUDPServer가 활성화되면 들어오는 UDP 패킷을 수신하기 위한 스레드가 생성됩니다. 수신된 각 패킷에 대해 ThreadedEvent 속성 값에 따라 기본 스레드 또는 수신 스레드의 컨텍스트에서 OnUDPRead 이벤트가 발생합니다. ThreadedEvent가 False로 평가되면 이벤트는 기본 스레드에서 발생하고, 그렇지 않으면 수신 스레드에서 발생합니다. 이벤트가 처리되는 동안 다른 서버 작업은 차단됩니다. 따라서 OnUDPRead 프로시저가 최대한 빨리 실행되도록 하는 것이 중요합니다.

기존 프로토콜을 사용하여 기존 서버에 대한 새 클라이언트 애플리케이션을 생성해야 하는 경우 작업은 전적으로 클라이언트 애플리케이션을 개발하고 디버그하는 것입니다. 그러나 클라이언트와 클라이언트를 모두 개발해야 하는 경우 서버 애플리케이션기존 프로토콜을 사용하든 새로운 프로토콜을 사용하든 우리는 고전적인 "닭과 달걀" 문제에 직면하게 됩니다. 프로그래밍을 시작할 위치는 클라이언트입니까, 아니면 서버입니까?

분명히 클라이언트와 서버는 모두 최종적으로 생성되어야 합니다. 많은 애플리케이션, 특히 텍스트 기반 프로토콜(예: HTTP)을 사용하는 애플리케이션의 경우 서버를 설계하여 애플리케이션 구축을 시작하는 것이 더 쉽습니다. 그리고 디버깅을 위해 이미 존재하는 편리한 클라이언트가 있습니다. 이는 Windows와 UNIX에서 모두 사용할 수 있는 Telnet 콘솔 응용 프로그램입니다.

콘솔을 입력하면 텔넷 명령 127.0.0.1 80을 로컬 컴퓨터의 IP 주소와 웹 서버에서 기본적으로 사용하는 포트 번호 80으로 설정하면 애플리케이션은 그림 1에 표시된 텍스트로 응답합니다. 6, Windows 2000 OS 및 IIS 5.0의 경우.

Indy 구성 요소를 사용하여 가장 간단한 서버를 만들려면 다음이 필요합니다.

연결이 끊어졌을 때 클라이언트에게 올바르게 알릴 뿐만 아니라 발생한 오류 상황에 대한 정보도 제공하는 서버를 설계해야 하는 경우 try-finally 대신 try-Exception 문을 사용하십시오. 예를 들어 다음과 같습니다. 다음 예에 나와 있습니다.

프로시저 TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: 문자열; AThread.Connection으로 시작하십시오. try s:= ReadLn; // 여기에서 서버 작업을 수행합니다. // 예외가 발생하지 않으면 // 서버의 응답을 기록합니다. WriteLn(s); 단, e: Exception do start WriteLn(e.Message); end; //on end; //마지막으로 연결 끊기를 제외하고 시도; end; end;

이 작은 예에서는 간단한 텍스트 서버를 만드는 단계와 디버깅 방법을 보여줍니다.

위에서 설명한 서버는 현대 분산 컴퓨팅 조직의 전형적인 예입니다.

다중 계층 애플리케이션 생성 기능

최근에는 클라이언트 요청을 충족하기 위해 여러 서버가 점점 더 많이 사용되고 있습니다. 이 유형의 서버는 클라이언트 요청을 수신하고 추가 처리를 위해 부분적으로 준비한 후 다른 서버에 연결하여 변환된 요청을 보냅니다. 그러면 두 번째 계층 서버는 다른 서버와 통신할 수 있습니다. 따라서 다중 계층 서버 아키텍처에 대해 이야기할 수 있습니다.

다음으로 데이터베이스에서 데이터를 반환하는 것이 목적인 데이터 액세스 서버를 만듭니다. 그러나 이 서버는 데이터베이스 파일을 직접 읽거나 쓰지 않습니다. 대신 클라이언트가 요구하는 데이터를 검색하기 위해 데이터베이스 서버와 통신합니다.

그래서 우리는 3계층 아키텍처를 갖춘 애플리케이션 개발을 시작합니다. Indy 구성 요소를 사용하여 데이터베이스 서버를 만들려면 다음이 필요합니다.

  1. 새 프로젝트를 만듭니다.
  2. 에 놓다 주요 형태 Indy Servers 팔레트에 있는 TIdTCPServer 구성 요소의 프로젝트 인스턴스입니다.
  3. TIdTCPServer1 클래스 인스턴스의 DefaultPort 속성을 6001로 설정하고(다른 애플리케이션에서 포트 번호가 중복되지 않도록 큰 값을 할당하는 것이 좋습니다) Active 속성을 true로 설정합니다.
  4. 파일 | 신규 | 데이터 모듈을 선택하고 구성 요소 팔레트의 dbExpress 탭에서 SQLConnection 및 SQLDataSet 구성 요소의 인스턴스를 배치합니다.
  5. SQLConnection 클래스의 ConnectionName 속성을 IBLocal로 설정하고 LoginPrompt를 False로 설정합니다. Employee.gdb 데이터베이스에 IBLocal을 구성하지 않은 경우 먼저 이 절차를 완료하십시오.

안녕하세요 여러분!

다음 웹 프로젝트를 개발할 때 POST 메서드를 사용하여 서버로 데이터를 전송하는 클라이언트 소프트웨어를 Delphi에 구현하는 작업이 발생했습니다. 애플리케이션은 텍스트를 전송하고 파일을 웹 서버에 업로드해야 합니다.

서버측 언어를 사용하여 이러한 데이터 전송 구현 웹 개발(예: PHP)는 매우 간단하지만 서버와 상호 작용하는 애플리케이션 기반 다중 사용자 소프트웨어를 작성해야 하는 경우에는 조금 더 복잡합니다. 데이터베이스에 직접 연결하고 FTP를 통해 Delphi에서 서버에 연결하는 방법은 더 이상 필요하지 않습니다. 안전하지 않고 신뢰할 수 없으며(비밀번호 변경, 연결 데이터 등) 추가 생성이 발생합니다. 클라이언트 측의 소프트웨어 호환성 문제. 이 문제를 해결하기 위해 PHP로 들어오는 내용을 처리하는 스크립트(서버 부분)를 작성하기로 결정했습니다. POST 요청그 결과를 클라이언트(Delphi 애플리케이션)에 반환합니다. 이 접근 방식의 장점은 모든 연결과 데이터 처리가 서버에서 발생하므로 직접적인 "연결"보다 훨씬 안전하다는 것입니다.

인터넷 검색을 시작했을 때 주로 포럼에 흩어져 있는 많은 정보가 제공되었지만 모두 조각난 정보였습니다. 한 가지 확실한 점은 Indy, 즉 POST 메서드가 구현된 IdHTTP 구성 요소가 사용될 것이라는 점입니다. 사실 모든 것이 간단합니다. 이 방법리소스의 두 매개변수 Url과 DataStream(데이터 스트림)을 사용하여 결과를 텍스트 형식으로 반환합니다(페이지의 HTML 코드일 수도 있음). 가장 중요한 것은 DataStream(전송된 데이터 스트림)의 올바른 형성이었지만 그 과정에서 러시아어 인코딩(좋지 않은 경우)과 같은 추가 함정이 나타났습니다. 몇 시간 동안 인터넷을 헤매는 재미가 시작된 곳입니다. 일반적으로 잡담은 충분히 하고 소프트웨어의 연습과 구현으로 넘어가겠습니다.

그래서 프로그램은 간단합니다. 그녀는 POST 메소드를 사용하여 서버에 데이터를 보내야 하며, 데이터에는 " 표제 " (선), " 설명 » ( 여러 줄 문자) 그리고 그래픽 파일(jpg, png, gif-바이너리 데이터). 서버는 이 데이터를 수락하고 처리한 후 서버에 그래픽 파일을 저장하고 응답을 반환해야 합니다. 이에 대한 응답으로 우리는 라벨이 추가되고 다운로드한 파일에 대한 링크만 포함된 동일한 텍스트인 Delphi를 애플리케이션에 반환할 것입니다. 다른 것은 없습니다.

서버 부분(사이트의 API와 유사) 구현부터 시작하겠습니다. 무엇이든 열기 텍스트 에디터(메모장)에 다음 코드를 작성합니다.

"; ) else ( echo "제목: 누락됨"."
"; ) //수신 데이터에 "content" 필드가 있는지 확인합니다. data if (!empty($_POST["content"]))( echo "Content: ".$_POST["content"]."
"; ) else ( echo "콘텐츠: 누락됨"."
"; ) //수신 데이터에 첨부된 파일 "file"이 있는지 확인합니다. if (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /파일에 대한 정보 가져오기(이름, 확장자 등) //허용된 형식 목록에서 파일 형식을 확인합니다(IMPROVISATION:)) if (stripos("jpgpnggif",$finfo["extension"] )==0)( echo ">>>>>>>잘못된 파일 형식<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

메모! 저장할 때(메모장을 통해) 인코딩 "UTF-8"을 지정해야 합니다. 그렇지 않으면 키릴 문자 표시에 문제가 발생합니다!

스크립트는 자세한 설명을 제공하려고 했습니다. 이 스크립트를 웹 서버에 복사하세요. 없는 경우 테스트에 내 스크립트를 사용할 수 있습니다. 스크립트는 다음 위치에 있습니다. http://api..php

레이아웃에서는 Label, Button(2개), Edit(2개), Memo(2개), CheckBox, OpenDialog, IdHTTP 등의 구성 요소를 사용합니다. 다음 구성 요소 이름(속성 “ 이름”):

  1. 편집(제목) – 이름=제목;
  2. 편집(파일 경로) 이름 = imgfile;
  3. 메모(목차)이름 = 내용;
  4. 메모(결과) – 이름 = 응답;
  5. 버튼(…) – 이름 = chkfile;
  6. 버튼(포스트) – 이름 = PostBut;
  7. OpenDialog(파일 선택 대화 상자) – 이름 = PictDialog;

IdHTTP1과 CheckBox1을 변경하지 않고 그대로 두겠습니다(피곤합니다! :)))).

실수하지 않도록 " 편집하다» 편집 경로( img파일), ReadOnly 속성을 True로 설정합니다. 마찬가지로, img파일그리고 chk파일활성화 속성을 false로 설정합니다. CheckBox를 사용하여 활성화하겠습니다. 이미지 업로드 여부를 선택할 수 있는 기회를 제공하겠습니다.

OpenDialog의 경우( Pict대화상자) 필터(필터 속성)를 다음과 같이 설정해야 합니다.

실제 시각적 준비는 끝났습니다! 코딩을 시작해보자!

프로젝트에서는 Indy에 포함된 유형을 사용하여 데이터 흐름을 생성합니다. TidMultiPartFormDataStream. TStream을 사용하여 구현 옵션을 발견했지만 TidMultiPartFormDataStream –더 쉽게!

이 유형을 프로젝트에서 사용할 수 있게 하려면 Uses에 다음 라이브러리를 추가해야 합니다. IdMultipartFormData.

CheckBox1의 경우 개체에서 마우스를 두 번 클릭하여 OnClick 이벤트를 만들고 이 이벤트에 다음 코드를 추가합니다.

절차 TForm1.CheckBox1Click(보내는 사람: TObject); 시작 //파일 경로 요소 및 대화 상자 버튼을 활성화 또는 비활성화합니다. imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; 끝;

여기서는 객체를 활성화합니다. img파일 그리고chk파일확인 표시의 유무에 따라(확인란이 선택되어 있으면 개체가 활성화됩니다).

이제 이미지 선택을 구성해 보겠습니다. 이렇게 하려면 버튼에 OnClick 이벤트를 생성하세요. chk파일(또한 개체를 두 번 클릭하여) 다음을 작성합니다.

프로시저 TForm1.chkfileClick(보내는 사람: TObject); 시작 //대화 상자를 열고 imgfile(TEdit)에 파일의 전체 경로를 입력합니다. if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; 끝;

이 이벤트는 이미지 선택 대화 상자를 트리거하며 사용자가 " 열려 있는"를 선택하면 이 파일의 경로가 다음에 추가됩니다. img파일.

이제 마지막 “POST” 버튼에 이르렀습니다. 이 버튼에 대한 OnClick 이벤트를 만들고 다음 코드를 추가합니다.

프로시저 TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; dataPost:=TIdMultiPartFormDataStream.Create 시작; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked and (trim(imgfile.Text)="") then //파일 선택 여부 확인 start ShowMessage("그래픽 파일을 선택해야 합니다!"); 출구; 끝; CheckBox1.Checked이면 dataPost.AddFile("file",imgfile.Text,""); //response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)," 파일이 있는 필드를 추가합니다.
",#13#10,); 데이터포스트.무료; 종료;

따라서 순서대로(의견이 있지만) 다음과 같습니다.

데이터포스트 – 유형의 객체 TIdMultiPartFormDataStream. 다양한 유형의 필드로 구성된 POST 요청 구조를 생성할 수 있습니다.

데이터포스트 . 양식 필드 추가 (" 제목 ", 제목 . 텍스트 ," UTF -8 "). 콘텐츠 전송 := " 8 조금 "; – "title.Text"의 값인 "title"이라는 필드를 DataPost에 추가하고 전송된 데이터의 인코딩을 "utf-8"로 설정합니다(매개변수는 선택 사항이지만 명시적인 표시가 없으면 키릴 문자가 다음과 함께 전송됩니다). 물음표 “?”)와 매우 중요한 방법인 "콘텐츠 전송"이 있습니다. 이 방법을 사용하지 않으면 데이터가 서버로 전송됩니다. 헛소리" 보내는 쪽의 필드 이름(“title”)은 스크립트에 지정된 이름($_POST["title"])과 일치해야 합니다.

데이터는 "콘텐츠" 필드와 유사하게 전송됩니다.

데이터포스트 . 파일 추가 (" 파일 ", img파일 . 텍스트 ,"") – 이 줄을 사용하여 파일의 데이터로 스트림을 생성합니다.

이제 데이터가 생성되고 남은 것은 이를 서버의 스크립트로 전송하고 응답을 받는 것뿐입니다.

response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,);

왜냐하면 TMemo가 줄바꿈 태그를 이해하지 못합니다."
"인 경우 " " 기능을 사용하여 이를 이해할 수 있는 줄 바꿈 "#13#10"으로 대체합니다.

모든 것이 완료되면 다음 줄을 사용하여 DataPost 개체에서 메모리를 지웁니다.

데이터포스트.무료;

이 예에서는 절차가 끝나면 자동으로 발생하지만 여전히...

화면에 표시된 프로그램의 실제 결과는 다음과 같습니다.

따라서 우리는 원하는 만큼의 데이터나 파일을 서버에 보내고, 서버에서 이 데이터를 처리하고, 스크립트 결과를 애플리케이션에 다시 보고할 수 있습니다. 0 또는 1일 수도 있으며 이는 애플리케이션이 추가로 반응하도록 신호를 보냅니다.

모두. 모두에게 행운을 빕니다. 정보가 도움이 되었기를 바라며 유용하게 활용하시기 바랍니다.

완성된 예제와 스크립트를 다운로드할 수 있습니다.

전체 모듈 코드:

유닛 포스트유닛; 인터페이스는 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient를 사용합니다. IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; 유형 TForm1 = 클래스(TForm) IdHTTP1: TIdHTTP; 제목: TEdit; 내용: TMemo; PostBut: TButton; 응답: TMemo; 라벨1: TLabel; 라벨2: TLabel; 라벨3: TLabel; imgfile:TEdit; chkfile: TButton; 라벨4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; 절차 PostButClick(Sender: TObject); 절차 chkfileClick(보내는 사람: TObject); 절차 CheckBox1Click(Sender: TObject); private(개인 선언) public(공개 선언) end; var Form1: TForm1; 구현($R *.dfm) 프로시저 TForm1.CheckBox1Click(Sender: TObject); 시작 //파일 경로 요소 및 대화 상자 버튼을 활성화 또는 비활성화합니다. imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; 끝; 절차 TForm1.chkfileClick(Sender: TObject); 시작 //대화 상자를 열고 imgfile(TEdit)에 파일의 전체 경로를 입력합니다. if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; 끝; 절차 TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; dataPost:=TIdMultiPartFormDataStream.Create 시작; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked and (trim(imgfile.Text)="") then //파일 선택 여부 확인 start ShowMessage("그래픽 파일을 선택해야 합니다!"); 출구; 끝; CheckBox1.Checked이면 dataPost.AddFile("file",imgfile.Text,""); //response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)," 파일이 있는 필드를 추가합니다.
",#13#10,); 데이터포스트.무료; 끝; 끝.