1. Delphi とソケット
コンピュータ ネットワークは一連のネットワーク通信プロトコルで構成されており、そのコア プロトコルはトランスポート層の TCP/ip プロトコルと UDP プロトコルです。 TCP は接続指向であり、現在の電話回線と同じように、通信する双方がパスを維持します。Telnet を使用して BBS にログインする場合は、TCP プロトコルが使用され、通信する側はそれぞれのパスを維持しません。ブラウザがインターネットにアクセスするときに使用されます。HTTP プロトコルは UDP プロトコルに基づいています。 TCP プロトコルと UDP プロトコルはどちらも非常に複雑で、特に TCP プロトコルでは、ネットワーク送信の正確性と有効性を確保するために、一連の複雑なエラー修正と並べ替えのプロセスを実行する必要があります。
ソケットは、トランスポート層プロトコル (主に TCP と UDP) に基づいたソケット仕様であり、2 台のコンピュータが通信するための仕様 (プログラミング仕様でもあります) を定義しています。 「チャネル」の場合、この「チャネル」の両端は 2 つのソケットになります。ソケットは、基礎となる通信ソフトウェアと特定のオペレーティング システム間の差異を保護し、TCP プロトコル ソフトウェアがインストールされ、ソケット仕様が実装されている 2 台のコンピュータ間の通信を可能にします。
Microsoft の Windows ソケット仕様 (略して winsock) は、Berkeley のソケット仕様を拡張し、その拡張機能を使用して任意のプラットフォーム上のソケットと通信できるようになり、コンピュータ間の通信をより効果的に実装できます。 Delphi では、基礎となるソケットも Windows ソケットである必要があります。 Socket はコンピュータ間の通信ソフトウェアを作成する難しさを軽減しますが、一般的には依然として非常に複雑です (これについては後で詳しく説明します)。InPRise は Windows Socket を Delphi に効果的にカプセル化し、ユーザーがネットワーク通信プログラムを簡単に作成できるようにします。以下では、Socket を使用して Delphi で通信プログラムを作成する方法を例を示して説明します。
2. Delphi を使用してソケット通信プログラムを作成します。
以下は、クライアントとサーバーが同じプログラムである単純なソケット通信プログラムです。クライアント (サーバー) が memo1 にテキストを入力して Enter を押すと、そのテキストがサーバー (クライアント) に表示されます。 memo2、その逆も同様です。具体的な手順は次のとおりです。
1. 新しいフォームを作成し、任意の名前を付けて、「MainMenu」(「Standard」列) を配置し、「Internet」列から「ListenItem」、「ConnectItem」、「Disconnect」、および「Exit」メニュー項目を作成します。これらを chatForm に追加します。ここで、TClientSocket の名前は ClientSocket に設定されます。ポートを 1025 に設定し、デフォルトのアクティブは false に設定します。TServerSocket の名前を ServerSocket に設定し、ポートを 1025 に設定し、デフォルトのアクティブは false に設定し、他は変更しないで、メモ 1 と名前を付けます。 other memo2 は主に相手の入力を表示するために使用するため、memo2 の色はグレーに設定されています。以下、コードを書きながらその理由を説明していきます。
2. 「ListemItem」をダブルクリックします。次のコードを記述します。
プロシージャ TChatForm.ListenItemClick(送信者: TObject);
始める
ListenItem.Checked := ListenItem.Checked ではありません。
ListenItem.Checked の場合
始める
ClientSocket.Active := False;
ServerSocket.Active := True;
終わり
それ以外
始める
ServerSocket.Activeの場合、
ServerSocket.Active := False;
終わり;
終わり;
このプログラム セグメントの説明は次のとおりです。 ユーザーが ListemItem を選択すると、ListenItem が反転されます。これは、Listen 状態が Listen 状態にあることを意味します。待機中の場合は、ServerSocket がアクティブ状態に設定されます。そうでない場合は、待機がキャンセルされ、ServerSocket が閉じられます。実際、最初にこのメニュー項目を選択するのはユーザーだけであり、プログラムがサーバーとして機能していることを示しています。逆に、ユーザーが ConnectItem を選択した場合は、それをクライアントとして使用する必要があります。
3. ConnectItem をダブルクリックし、次のコードを入力します。
プロシージャ TChatForm.ConnectItemClick(送信者: TObject);
始める
ClientSocket.Active の場合、ClientSocket.Active := False;
if InputQuery('接続先のコンピュータ', 'アドレス名:', サーバー) then
長さ(サーバー) > 0の場合
ClientSocket を使用して行う
始める
ホスト := サーバー;
アクティブ := True;
ListenItem.Checked := False;
終わり;
終わり;
このプログラムの主な機能は、ユーザーが ConnectItem メニュー項目を選択すると、入力ボックスがポップアップしてサーバーのアドレスを入力できるようにするときに、アプリケーションをクライアントとして設定することです。これが、ユーザーが異なるサーバーに動的に接続できるように、最初に ClientSocket ホストを修正しない理由です。読者が理解する必要があるのは、ホスト アドレスは、Socket がクライアントの場合に持つ属性にすぎず、Socket はローカル マシンにバインドされているため、「通常は」そのアドレスを使用しないということです。
4. memo1 の keydown メソッドに次のコードを記述します。
プロシージャ TChatForm.Memo1KeyDown(送信者: TObject; var Key: Word;
シフト: TShiftState);
始める
キー = 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(送信者: TObject;
ソケット: TCustomWinSocket);
始める
IsServer := True;
終わり;
ServerSocket の Accept メソッドは、クライアントが初めて接続したときに完了します。そのパラメータから、標準の accept メソッドの後に実行されると考えられます。パラメータの型は TCustomWinSocket であるため、それが戻り値になります。標準のサーバー側ソケット。
プロシージャ TChatForm.ClientSocketRead(送信者: TObject;
ソケット: TCustomWinSocket);
始める
Memo2.Lines.Add(Socket.ReceiveText);
終わり;
プロシージャ TChatForm.ServerSocketClientRead(送信者: TObject;
ソケット: TCustomWinSocket);
始める
Memo2.Lines.Add(Socket.ReceiveText);
終わり;
これら 2 つのコードは、サーバー側とクライアント側が互いのメッセージを受信したときに Delphi によってトリガーされ、その機能は受信したメッセージを memo2 に表示することです。このうち、ClientSocketRead の Socket は実際には Socket そのものであり、ServerSocketClientRead の Socket は実際には ServerSocket.Socket.Connection[] の Socket です。ただし、Delphi では、サーバー側のソケットは効果的にカプセル化されます。
プロシージャ TChatForm.ServerSocketClientConnect(送信者: TObject;
ソケット: TCustomWinSocket);
始める
メモ2.線.クリア;
終わり;
プロシージャ TChatForm.ClientSocketDisconnect(送信者: TObject;
ソケット: TCustomWinSocket);
始める
ListenItemClick(nil);
終わり;
これら 2 つの段落は比較的単純です。このうち、ServerSocketClientConnect は、ServerSocket が新しい接続を受信したときにトリガーされます。 ClientSocketDisconnect は、ClientSocket が Disconncet を発行するとトリガーされます。
プロシージャ TCatForm.Exit1Click(送信者: TObject);
始める
ServerSocket.Close;
ClientSocket.Close;
近い;
終わり;
プロシージャ TChatForm.Disconnect1Click(送信者: TObject);
始める
ClientSocket.Active := False;
ServerSocket.Active := True;
終わり;
最初の段落はアプリケーションを閉じることです。標準ソケットでは、各ソケットが閉じられるとき、closesocket() メソッドを呼び出す必要があります。そうしないと、システムはリソースを解放しません。 ServerSockt.Close および ClientSocket.Close では、closesocket() メソッドをシステムの内部で呼び出す必要があります。
3. 標準ソケットと Delphi のソケット。
標準の Socket アプリケーション フレームワークは次のとおりです。
サーバー側: Socket()[新しいソケットを作成]--Bind()[サーバーアドレスとバインド]--Listen()--Accept()--block wait--read()[ウィンドウでメッセージを受け入れるplatform 、メソッドは send(TCP) または sendto(UDP)] -- サービス要求の処理 -- Write() [メッセージの送信、Windows プラットフォームの場合、メソッドは send(TCP)、またはsendto(UDP)。
クライアント側は比較的単純です: Socket()--Connect() [特定のポートを介して特定のサーバーに接続し、サーバーとの接続を確立します]--Write()--Read()。
ソケットは TCP または UDP に基づくことができ、ソケットは IPX/SPX、DECNet などの他のプロトコルに基づいて構築されることもあります。新しいソケットを作成するときに、作成するソケットのタイプを指定できます。 Bind() は、サーバーのアドレスにバインドするために使用されます。ホストに IP アドレスが 1 つしかない場合、バインディングの役割は実際には比較的冗長です。 Listen() はネットワークの監視を開始し、Accept() は接続を受け入れるために使用され、その戻り値はクライアントとの接続を維持する Socket です。
Delphi では、Windows のソケットが効果的にカプセル化されます。 Delphi では、継承関係に従って、次の 2 つのカテゴリに分類できます。
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. TObject から直接継承します。
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
最初のタイプは TCustomSocket に基づいており、2 番目のタイプは TCustomWinSocket に基づいていることがわかります。最初のタイプは TComponet 上に構築され、2 番目のタイプは TObject 上に直接構築されます。したがって、ユーザーが Socket に精通しており、コンソール プログラムを作成したい場合は、TCustomWinScoket クラスを使用できます。
同じ用途から分かるように、これらはすべて ScktComp.pas に実装されており、schtComp.pas にはwinsock.pas ファイルが含まれています。winsock ファイルをさらに詳しく調べていくと、Windows Socket の基本的なメソッドがすべて見つかります。
実際、標準の Socket アプリケーション フレームワークを理解していれば、Delphi を使用して Socket アプリケーションを作成することに慣れます。これは、複雑な Socket の標準関数を理解する必要があるという意味ではありません。Delphi はすでにそれを行っているため、その必要はありません。これは Delphi の強みであり、基本的なフレームワークを少し理解するだけで済みます。
これは Delphi の Socket アプリケーションについての私の理解です。欠点がある場合は修正していただければ幸いです。同時に、Delphi の Socket に関する質問にも喜んでお答えします。