1. 델파이와 소켓
컴퓨터 네트워크는 일련의 네트워크 통신 프로토콜로 구성되며, 그 핵심 프로토콜은 전송 계층의 TCP/ip 및 UDP 프로토콜입니다. TCP는 연결 지향적이며 두 통신 당사자 모두 현재 전화선과 마찬가지로 경로를 유지합니다. 텔넷을 사용하여 BBS에 로그인하는 경우 UDP 프로토콜이 사용되며 통신 당사자는 각각을 유지하지 않습니다. other's status 브라우저가 인터넷에 접속할 때 사용됩니다. HTTP 프로토콜은 UDP 프로토콜을 기반으로 합니다. TCP와 UDP 프로토콜은 모두 매우 복잡하며, 특히 TCP 프로토콜은 네트워크 전송의 정확성과 효율성을 보장하기 위해 일련의 복잡한 오류 수정 및 정렬 프로세스를 수행해야 합니다.
소켓은 전송 계층 프로토콜(주로 TCP 및 UDP)을 기반으로 하는 소켓 사양으로, 원래 캘리포니아 대학 버클리 캠퍼스에서 제안되었습니다. 두 컴퓨터가 통신하는 경우의 사양을 정의합니다. "채널"이면 이 "채널"의 두 끝은 두 개의 소켓입니다. 소켓은 기본 통신 소프트웨어와 특정 운영 체제 간의 차이점을 보호하여 TCP 프로토콜 소프트웨어를 설치하고 소켓 사양을 구현한 두 컴퓨터 간의 통신을 가능하게 합니다.
Microsoft의 Windows 소켓 사양(줄여서 Winsock)은 Berkeley의 소켓 사양을 확장합니다. 표준 소켓 방법을 사용하면 해당 확장을 사용하여 모든 플랫폼에서 소켓과 통신할 수 있으며, 컴퓨터 간 통신을 더욱 효과적으로 구현할 수 있습니다. Delphi에서는 기본 소켓도 Windows 소켓이어야 합니다. 소켓은 컴퓨터 간 통신 소프트웨어 작성의 어려움을 줄여주지만 일반적으로 여전히 매우 복잡합니다(이에 대해서는 나중에 자세히 설명합니다). InPRise는 Delphi에서 Windows 소켓을 효과적으로 캡슐화하여 사용자가 네트워크 통신 프로그램을 쉽게 작성할 수 있도록 합니다. 아래에서는 소켓을 사용하여 델파이에서 통신 프로그램을 작성하는 방법을 예제와 함께 설명합니다.
2. Delphi를 사용하여 소켓 통신 프로그램을 작성합니다.
다음은 클라이언트와 서버가 동일한 프로그램인 간단한 소켓 통신 프로그램입니다. 클라이언트(서버)가 메모1에 텍스트를 입력하고 Enter 키를 누르면 해당 텍스트가 서버(클라이언트)에 표시됩니다. memo2에서는 그 반대도 마찬가지입니다. 구체적인 단계는 다음과 같습니다:
1. 새 양식을 생성하고 임의로 이름을 지정할 수도 있습니다. MainMenu(Standard 열에)를 배치하고 인터넷 열에서 TServerSocket 및 TClientSocket을 선택합니다. TClientSocket의 이름이 ClientSocket으로 설정된 chatForm에 추가하세요. 포트를 1025로 설정하고, 기본 활성은 false입니다. TServerSocket의 이름을 ServerSocket으로 설정하고, 포트를 1025로 설정하고, 기본 활성은 false로 두고, 나머지는 변경하지 않고 두 개의 메모를 입력합니다. 하나는 memo1입니다. 기타 메모2의 경우 주로 상대방의 입력을 표시하는 데 사용되므로 메모2의 색상을 회색으로 설정합니다. 아래에서는 코드를 작성하면서 이유를 설명합니다.
2. ListemItem을 두 번 클릭합니다. 다음 코드를 작성하세요.
절차 TChatForm.ListenItemClick(Sender: TObject);
시작하다
ListenItem.Checked := ListenItem.Checked가 아닙니다.
ListenItem.Checked인 경우
시작하다
ClientSocket.Active := 거짓;
ServerSocket.Active := 참;
끝
또 다른
시작하다
ServerSocket.Active이면
ServerSocket.Active := 거짓;
끝;
끝;
이 프로그램 세그먼트에 대한 설명은 다음과 같습니다. 사용자가 ListemItem을 선택하면 ListenItem이 반전됩니다. 선택하면 청취 상태에 있음을 의미합니다. 독자가 이해해야 할 것은 소켓이 서비스할 때의 독점 방법입니다. 수신 중이면 ServerSocket이 활성 상태로 설정됩니다. 그렇지 않으면 수신이 취소되고 ServerSocket이 닫힙니다. 실제로 처음에는 사용자만이 이 메뉴 항목을 선택하여 프로그램이 서버 역할을 하고 있음을 나타냅니다. 반대로 ConnectItem을 선택하면 반드시 Client로 사용되어야 합니다.
3. ConnectItem을 두 번 클릭하고 다음 코드를 입력합니다.
절차 TChatForm.ConnectItemClick(Sender: TObject);
시작하다
ClientSocket.Active이면 ClientSocket.Active := False;
if InputQuery('연결할 컴퓨터', '주소 이름:', 서버) then
길이(서버) > 0이면
ClientSocket을 사용하면
시작하다
호스트 := 서버;
활성 := 참;
ListenItem.Checked := 거짓;
끝;
끝;
이 프로그램의 주요 기능은 사용자가 ConnectItem 메뉴 항목을 선택하면 응용 프로그램을 클라이언트로 설정하고 사용자가 서버 주소를 입력할 수 있는 입력 상자가 팝업으로 나타나는 것입니다. 이것이 바로 사용자가 다른 서버에 동적으로 연결할 수 있도록 처음에 ClientSocket 호스트를 수정하지 않는 이유입니다. 독자가 이해해야 할 것은 호스트 주소는 소켓이 클라이언트일 때 갖는 속성일 뿐이라는 것입니다. 소켓이 서버인 경우 로컬 시스템에 바인딩되어 있기 때문에 "일반적으로" 주소를 사용하지 않습니다.
4. memo1의 keydown 메소드에 다음 코드를 작성합니다.
절차 TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word;
시프트: TShiftState);
시작하다
Key = VK_Return이면
IsServer라면
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
또 다른
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
끝;
이 코드의 기능은 분명합니다. 즉, 메시지 보내기를 시작합니다. 서버인 경우 첫 번째 클라이언트에게만 메시지를 보냅니다. 서버는 여러 클라이언트에 연결할 수 있고 클라이언트와의 각 연결은 소켓에 의해 유지되므로 ServerSocket.Socket.Connections 배열이 저장됩니다. 클라이언트와의 연결을 유지하는 것입니다. 표준 Socket에서 서버측 Socket은 accept() 메소드의 반환값을 통해 클라이언트와의 연결을 유지하는 Socket을 획득하며, 메시지를 주고받는 메소드는 각각 send(sendto), recv(recvfrom)이다. . Delphi는 이러한 캡슐화를 수행했습니다.
5. 나머지 코드에 대한 간략한 소개.
프로시저 TChatForm.ServerSocketAccept(Sender: TObject;
소켓: TCustomWinSocket);
시작하다
IsServer := 참;
끝;
ServerSocket의 Accept 메소드는 클라이언트가 처음 접속할 때 완료되는데, 해당 파라미터를 보면 표준 accept 메소드 이후에 실행된다고 볼 수 있는데, 이는 TCustomWinSocket의 파라미터 타입이 있기 때문이다. 표준 서버측 소켓.
프로시저 TChatForm.ClientSocketRead(Sender: TObject;
소켓: TCustomWinSocket);
시작하다
Memo2.Lines.Add(Socket.ReceiveText);
끝;
프로시저 TChatForm.ServerSocketClientRead(Sender: TObject;
소켓: TCustomWinSocket);
시작하다
Memo2.Lines.Add(Socket.ReceiveText);
끝;
이 두 코드는 서버측과 클라이언트측이 서로의 메시지를 수신할 때 Delphi에 의해 트리거되며, 해당 기능은 수신된 메시지를 메모2에 표시하는 것입니다. 그 중 ClientSocketRead의 소켓은 실제로는 소켓 자체이고, ServerSocketClientRead의 소켓은 실제로 ServerSocket.Socket.Connection[]의 소켓입니다. 그러나 Delphi에서는 서버측 소켓이 효과적으로 캡슐화됩니다.
프로시저 TChatForm.ServerSocketClientConnect(Sender: TObject;
소켓: TCustomWinSocket);
시작하다
Memo2.Lines.Clear;
끝;
절차 TChatForm.ClientSocketDisconnect(Sender: TObject;
소켓: TCustomWinSocket);
시작하다
ListenItemClick(nil);
끝;
이 두 문단은 비교적 간단합니다. 그중 ServerSocketClientConnect는 ServerSocket이 새 연결을 수신할 때 트리거됩니다. ClientSocketDisconnect는 ClientSocket이 Disconncet을 발행할 때 트리거됩니다.
절차 TChatForm.Exit1Click(Sender: TObject);
시작하다
서버소켓.닫기;
클라이언트소켓.닫기;
닫다;
끝;
절차 TChatForm.Disconnect1Click(Sender: TObject);
시작하다
ClientSocket.Active := 거짓;
ServerSocket.Active := 참;
끝;
첫 번째 단락은 응용 프로그램을 닫는 것입니다. 표준 소켓에서는 각 소켓이 닫힐 때 closesocket() 메서드를 호출해야 합니다. 그렇지 않으면 시스템이 리소스를 해제하지 않습니다. ServerSockt.Close 및 ClientSocket.Close에서 closesocket() 메서드는 시스템 내부에서 호출되어야 합니다.
3. 표준 소켓과 델파이의 소켓.
표준 소켓 애플리케이션 프레임워크는 다음과 같습니다.
서버측: Socket()[새 소켓 생성]--Bind()[서버 주소로 바인딩]--Listen()--Accept()--block wait--read()[메시지 수락, 창에서 platform , 메소드는 send(TCP) 또는 sendto(UDP)]--프로세스 서비스 요청--Write()[send 메시지, Windows 플랫폼에서 메소드는 send(TCP), 또는 (UDP)로 보내십시오.
클라이언트 측은 비교적 간단합니다. Socket()--Connect() [특정 포트를 통해 특정 서버에 연결합니다. 이는 서버와 연결을 설정합니다]--Write()--Read().
소켓은 TCP 또는 UDP를 기반으로 할 수 있으며 소켓은 IPX/SPX, DECNet 등과 같은 다른 프로토콜에도 구축됩니다. 새 소켓을 생성할 때 생성할 소켓 유형을 지정할 수 있습니다. Bind()는 서버 주소에 바인딩하는 데 사용됩니다. 호스트에 IP 주소가 하나만 있는 경우 바인딩의 역할은 실제로 상대적으로 중복됩니다. Listen()은 네트워크 모니터링을 시작하고 Accept()는 연결을 수락하는 데 사용되며 반환 값은 클라이언트와의 연결을 유지하는 소켓입니다.
Delphi에서는 Windows의 소켓이 효과적으로 캡슐화됩니다. 델파이에서는 상속 관계에 따라 두 가지 범주로 나눌 수 있습니다.
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. TObject에서 직접 상속:
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
첫 번째 유형은 TCustomSocket을 기반으로 하고 두 번째 유형은 TCustomWinSocket을 기반으로 함을 알 수 있습니다. 첫 번째 유형은 TComponet에 구축되고 두 번째 유형은 TObject에 직접 구축됩니다. 따라서 사용자가 Socket에 매우 익숙하고 콘솔 프로그램을 작성하려는 경우 TCustomWinScoket 클래스를 사용할 수 있습니다.
동일한 용도에서 볼 수 있듯이 모두 ScktComp.pas에 구현되어 있으며 schtComp.pas에는 Winsock.pas 파일이 포함되어 있습니다. Winsock 파일을 계속해서 살펴보면 Windows Socket의 기본 메서드를 모두 찾을 수 있습니다.
사실, 표준 소켓 애플리케이션 프레임워크를 이해한다면 Delphi를 사용하여 소켓 애플리케이션을 작성하는 것이 편할 것입니다. 이는 복잡한 소켓의 표준 기능을 이해해야 한다는 의미는 아니며, 델파이가 이미 이를 수행했기 때문에 그럴 필요도 없습니다. 잘 캡슐화되어 있다는 점이 델파이의 강점입니다. 기본 프레임워크를 조금만 이해하면 됩니다.
이것은 Delphi의 소켓 애플리케이션에 대한 제가 이해한 내용입니다. 부족한 점이 있으면 수정해 주시기 바랍니다. 동시에 Delphi의 소켓에 관한 질문에도 기꺼이 답변해 드리겠습니다.