Difference between revisions of "Networking/ja"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; removed categories included in template)
 
(15 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 
{{Networking}}
 
{{Networking}}
 
  
 
{{Japanese Menu}}
 
{{Japanese Menu}}
  
このページは、Lazarusでのネットワークプログラムについてのチュートリアルを開始するページになるでしょう。
+
このページは、Lazarus と 平易な FPC を用いたネットワークプログラムについての情報とチュートリアル/コードのページです。
この記事に、リンクやセクション、ページ、あなたのWikiへのリンクを追加していってください。
 
  
(訳注:最初にこの元記事を書いた人はネットワークプログラミングの専門でなく、独学で勉強したことを書いているそうです。日本では、一般的にネットワークプログラミングというと、ソケット、サービス、クライアントサーバー関連の事を指す事が多いのですが、ここでは、XML、およびその派生の仕様によるWEBサービスでのネットワーキングの記事になっていますので、クライアントサーバー、ソケット関連の記事を期待している方は別途TCP/IPソケットコンポーネントや、軽量ネットワークコンポーネントを参照してください。)
+
(訳注:最初にこの元記事を書いた人はネットワークプログラミングの専門でなく、独学で勉強したことを書いているそうです)
  
このページには、一般的な情報があります。
+
== TCP/IP プロトコル ==
  
__TOC__
+
{{Note|FPC/Lazarus には、ネットワーキングの機能を使うための様々なライブラリ(Synapse, lnet, fphttpclient, Indy,...)があるため、それらのライブラリに対して多くのサンプルコードが記述できるでしょう。 したがって、異なるライブラリに対しても同じサンプルコードを何度もみることになるかもしれません。 複数のネットワークライブラリの使用が可能なフレームワークの作り方の例について、 [http://brookframework.org] や [https://bitbucket.org/reiniero/fpctwit] フレームワークもご参照ください}}
== その他のネットワークのチュートリアル ==
 
  
* [[:fpc:Secure programming | セキュア・プログラミング]]
+
=== CGI/FastCGI - REST, CRUD, チャットやブログ、ウェブページなど ===
  
* [[Sockets]] - TCP/IP ソケットコンポーネント
+
これらの機能は [[fcl-web]] を使うことで可能となります。 また、 Brook フレームワーク( [http://silvioprog.github.io/brookframework this page] )でも実装されています。
  
* [[lNet]] - 軽量ネットワークコンポーネント
+
=== SSH/Telnet クライアント、メールの送信、ファイルのダウンロードや OAuth v1.0 の例 ===
 +
[[Synapse]]のページをご覧ください。
  
== TCP/IP Protocol ==
+
=== Webサーバの例 ===
  
== XML ==
+
以下は Synapse ライブラリを用いて記述した http サーバの例です。Mac OS Xでテストしました。ただし、Mac OS Xの socket ユニットでは定数 MSG_NOSIGNAL が定義されていないため、Synapse のソースに定数定義 MSG_NOSIGNAL = $20000 を追加してコンパイルしました(訳注 : 2010年9月現在SVNで流れている Synapse の新バージョンでは、上記の定数が追加されており、無修正でコンパイルできます)。
  
XML(=The Extensible Markup Language)とは、[http://www.w3.org/ W3C] が推奨する異なるシステム間での情報のやりとりをするための言語です。
+
<syntaxhighlight lang=pascal>
これは、情報を保存するために、テキストを基本とする方法です。最近のXHTMLのようなデータ交換方法はWebサービス技術などでもよく使われていますが、それらは、XMLを基礎としています。
+
{
 +
  マイクロ Pascal ウェブサーバ
 +
 +
  Synapseライブラリを用いた極単純なウェブサーバの実装例である。
 +
 +
  ブロッキングモードのソケットを用いた単一スレッドアプリケーションであるため
 +
  複数のリクエストを並行して処理することはできない。
  
現在、Lazarus上では、XMLをサポートするユニット(群)があります。
+
  ブラウザから受け取ったヘッダは標準出力に出力される。
これらのユニットは、"XMLRead", "XMLWrite" そして "DOM"と呼ばれていますが、これらは、FreePascalCompilerからの、FCLの一部になっています。
 
  
FCLライブラリはすでにLazarusのデフォルトの検索パスにはいっていますので、それらのユニットをusesするようにすれば、XMLの機能を享受できます。FCLは現在(October / 2005)のところ、文書化されていません。
+
  サービス可能なウェブページのURIは固定で、'/' のみである。
ですから、このチュートリアルでは、これらのユニットをつかって、XMLアクセスの方法をご紹介することにしましょう。
+
  ほかのURIに対しては '504 not found' を返す。
 +
}
 +
program upserver;
  
XMLのDOM (Document Object Model)は、異なるシステム間でXMLを利用するための同じようなインターフェースを提供する、標準化されたオブジェクトの集合です。
+
{$ifdef fpc}
 +
  {$mode delphi}
 +
{$endif}
  
オブジェクトの標準化といっても、メソッド、プロパティ、オブジェクトの他へのインターフェースパーツのみで、異なる言語や実装といった要素は除去されています。
+
{$apptype console}
FCLは現在、完全に[http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/|XML DOM 1.0]をサポートしています.
 
  
(訳注:XML,DOMを「完全に」パースする、という実装は、かなり大変なことです。また、異機種間での利用を目的に作られていることに注意しましょう。Lazarusは、クロスコンパイル環境であり、これを標準で持っている事は、とても便利に快適にプログラムが出来ると思われます。日本語がどこまで検証されているのか、というところは、訳からはちょっと分かりませんが...。)
+
uses
 +
  Classes, blcksock, sockets, Synautil, SysUtils;
  
 +
{@@
 +
  コネクションに参加する。ヘッダを読み、しかるべき返信を行う
 +
}
 +
procedure AttendConnection(ASocket: TTCPBlockSocket);
 +
var
 +
  timeout: integer;
 +
  s: string;
 +
  method, uri, protocol: string;
 +
  OutputDataString: string;
 +
  ResultCode: integer;
 +
begin
 +
  timeout := 120000;
  
=== 基本的な例 ===
+
  WriteLn('Received headers+document from browser:');
  
たとえば、'C:\Programas\teste.xml'といったXMLファイルにアクセスしてみたいとしましょう。
+
  //リクエストラインを読み込む
このファイルは次のようなものだとします:
+
  s := ASocket.RecvString(timeout);
 +
  WriteLn(s);
 +
  method := fetch(s, ' ');
 +
  uri := fetch(s, ' ');
 +
  protocol := fetch(s, ' ');
  
<code>
+
  //リクエストヘッダを読み込む
<?xml version="1.0" encoding="ISO-8859-1"?>
+
   repeat
<images directory="mydir">
+
     s := ASocket.RecvString(Timeout);
   <imageNode URL="graphic.jpg" title="">
+
     WriteLn(s);
     <Peca DestinoX="0" DestinoY="0">Pecacastelo.jpg1.swf</Peca>
+
   until s = '';
     <Peca DestinoX="0" DestinoY="86">Pecacastelo.jpg2.swf</Peca>
 
   </imageNode>
 
</images>
 
</code>
 
  
次のコードはノード名をフォーム上のTMemoに書き出す例です。
+
  // ここで出力ストリームに文書を書き込む
  
<code>
+
   if uri = '/' then
var
 
   Documento: TXMLDocument;
 
  i, j: Integer;
 
begin
 
  Documento := TXMLDocument.Create;
 
  ReadXMLFile(Documento, 'C:\Programas\teste.xml');
 
  Memo.Lines.Clear;
 
  with Documento.DocumentElement.ChildNodes do
 
 
   begin
 
   begin
     for i := 0 to (Count - 1) do
+
     // 出力する文書をストリームに書く
    begin
+
    OutputDataString :=
       Memo.Lines.Add(Item[i].NodeName + ' ' + Item[i].NodeValue);
+
      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
      for j := 0 to (Item[i].ChildNodes.Count - 1) do
+
       + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + CRLF
      begin
+
       + '<html><h1>Teste</h1></html>' + CRLF;
        Memo.Lines.Add(Item[i].ChildNodes.Item[j].NodeName + ' '
 
        + Item[i].ChildNodes.Item[j].NodeValue);
 
       end;
 
    end;
 
  end;
 
  Documento.Free;
 
end;
 
</code>
 
  
=== TreeViewにXMLを表現する ===
+
    // ヘッダをクライアントに返信する
 +
    ASocket.SendString('HTTP/1.0 200' + CRLF);
 +
    ASocket.SendString('Content-type: Text/Html' + CRLF);
 +
    ASocket.SendString('Content-length: ' + IntTostr(Length(OutputDataString)) + CRLF);
 +
    ASocket.SendString('Connection: close' + CRLF);
 +
    ASocket.SendString('Date: ' + Rfc822DateTime(now) + CRLF);
 +
    ASocket.SendString('Server: Servidor do Felipe usando Synapse' + CRLF);
 +
    ASocket.SendString('' + CRLF);
  
XMLファイルの一般的な利用のひとつに、ツリー形式に構文を解析して、内容を表示することです。 Lazarusの上の「Common Control」タブに、ツリー形式に表示するためのTTreeViewコンポーネントがあります。
+
  //  if ASocket.lasterror <> 0 then HandleError;
  
以下での機能は、あらかじめファイルからロードされたか、コードで作られたXMLドキュメントを取得し、コンテンツの内容をTreeViewに表示します。
+
    //文書をブラウザに送信する
それぞれのノードのキャプションは、それぞれの(XMLの内容の)最初の属性になるでしょう。
+
    ASocket.SendString(OutputDataString);
 +
  end
 +
  else
 +
    ASocket.SendString('HTTP/1.0 504' + CRLF);
 +
end;
  
<pre>
 
procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument);
 
 
var
 
var
   iNode: TDOMNode;
+
   ListenerSocket, ConnectionSocket: TTCPBlockSocket;
 +
begin
 +
  ListenerSocket := TTCPBlockSocket.Create;
 +
  ConnectionSocket := TTCPBlockSocket.Create;
  
   procedure ProcessNode(Node: TDOMNode; TreeNode: TTreeNode);
+
   ListenerSocket.CreateSocket;
   var
+
   ListenerSocket.setLinger(true,10);
    cNode: TDOMNode;
+
   ListenerSocket.bind('0.0.0.0','1500');
   begin
+
  ListenerSocket.listen;
    if Node = nil then Exit; // Stops if reached a leaf
 
   
 
    // Adds a node to the tree
 
    TreeNode := tree.Items.AddChild(TreeNode, Node.Attributes[0].NodeValue);
 
  
    // Goes to the child node
+
  repeat
     cNode := Node.ChildNodes.Item[0];
+
     if ListenerSocket.canread(1000) then
 
 
    // Processes all child nodes
 
    while cNode <> nil do
 
 
     begin
 
     begin
       ProcessNoDe(cNode, TreeNode);
+
       ConnectionSocket.Socket := ListenerSocket.accept;
       cNode := cNode.NextSibling;
+
      WriteLn('Attending Connection. Error code (0=Success): ', ConnectionSocket.lasterror);
 +
       AttendConnection(ConnectionSocket);
 
     end;
 
     end;
   end;
+
   until false;
   
 
begin
 
  iNode := XMLDoc.DocumentElement.ChildNodes.Item[0];
 
  while iNode <> nil do
 
  begin
 
    ProcessNode(iNode, nil); // Recursive
 
    iNode := iNode.NextSibling;
 
  end;
 
end;
 
</pre>
 
 
 
=== XML文書を更新する ===
 
まず最初に覚えていただきたいのが、TDOMDocumentがDOMへの「ハンドル」であるということです。
 
あなたはこのクラスのインスタンスを、生成するか、XML文書をロードすることで取得できます。
 
 
 
一方、通常のオブジェクトのようにノードを生成することはできません。 ノードを作成するためには、TDOMDocumentで提供されている方法、または、他の方法として、ツリー構造の上の正しい場所に設定する方法を使用しなければなりません。 この理由は、ノードがDOMの上の、ある特定のドキュメントによって「所有」されなければならないからです。
 
  
下記は、TDOMDocumentの共通のメソッドです。
+
  ListenerSocket.Free;
 +
  ConnectionSocket.Free;
 +
end.
 +
</syntaxhighlight>
  
<pre>
 
  function CreateElement(const tagName: DOMString): TDOMElement; virtual;
 
  function CreateTextNode(const data: DOMString): TDOMText;
 
  function CreateCDATASection(const data: DOMString): TDOMCDATASection;
 
    virtual;
 
  function CreateAttribute(const name: DOMString): TDOMAttr; virtual;
 
</pre>
 
  
ここで、TTreeViewに選択された項目の場所に、XML文書の子ノードを挿入する例を示します。
+
=== FPC に備え付けの fcl-net コンポーネントを用いた TCP/IP クライアント-サーバ の例 ===
[[Networking#Populating a TreeView with XML|XML2Tree function]]を使うことによって、TreeViewはXMLファイルの内容を完全に表現できていなくてはなりません。
 
  
<pre>
+
[http://pascalgeek.blogspot.com/2012/06/encryption-decryption-and-asynchronous.html ブログ記事における例]をご覧ください。
procedure TForm1.actAddChildNode(Sender: TObject);
 
var
 
  Posicao: Integer;
 
  NovoNo: TDomNode;
 
begin
 
  {*******************************************************************
 
  *  Detects the selected element
 
  *******************************************************************}
 
  if TreeView1.Selected = nil then Exit;
 
 
 
  if TreeView1.Selected.Level = 0 then
 
  begin
 
    Posicao := TreeView1.Selected.Index;
 
  
    NovoNo := XMLDoc.CreateElement('item');
+
=== HTTP ページのダウンロードや POST を用いたウェブサーバへのアップロード、external IP アドレスの取得 ===
    TDOMElement(NovoNo).SetAttribute('nome', 'Item');
 
    TDOMElement(NovoNo).SetAttribute('arquivo', 'Arquivo');
 
    XMLDoc.DocumentElement.ChildNodes.Item[Posicao].AppendChild(NovoNo);
 
  
    {*******************************************************************
+
これらの例は、 [[fphttpclient#Examples]] で見つかります(FPC/Lazarus に備え付けの fphttpclient コンポーネントを使用した例です)
    *  Updates the TreeView
 
    *******************************************************************}
 
    TreeView1.Items.Clear;
 
    XML2Tree(TreeView1, XMLDoc);
 
  end
 
  else if TreeView1.Selected.Level >= 1 then
 
  begin
 
    {*******************************************************************
 
    *  This function only works on the first level of the tree,
 
    *  but can easely modifyed to work for any number of levels
 
    *******************************************************************}
 
  end;
 
end;
 
</pre>
 
  
 
== Webサービス ==
 
== Webサービス ==
  
W3CによるWEBサービスはネットワークの上のマシンから、別のマシンへ、共通的に利用できるように設計されたソフトウェア・システムの名称です。
+
[http://www.w3.org/ W3C] によると、 Web サービスとは ネットワーク越しに機械と機械を相互に利用できるように設計されたソフトウェアの名称です。
WEBサービスには、WSDLなど、「機械が処理可能」な形式で記述されているインタフェースがあります。
 
また、他のシステムは、多くの場合、インタフェースによってSOAPに内包されるメッセージを使用し定められた方法でウェブサービスと対話します。もしくは、RESTによる方法を取るかもしれません。
 
これらのメッセージは、通常HTTPを使用して伝達され、ウェブ関連の他の規格に関連するXMLから成りたっています。
 
  
様々なプログラミング言語で書かれ、様々なプラットホームで動くソフトウェアアプリケーションは、データをおたがいに一つのコンピュータでコミュニケーションを処理します。それと同様の方法を使って、インターネットのようなコンピュータネットワークの上でもコミュニケーションを行うために、WEBサービスを利用することができます。
+
Web サービスは、 WSDL などのように 「機械が処理可能」 な形式で記述されているインタフェースを持ちます。 そのほかのシステムは、SOAP エンベロープに含まれるメッセージを使用したインタフェースによって定められた方法で、ウェブサービスと対話します。もしくは、RESTの原則に従うかもしれません。
 +
これらのメッセージは、一般的に HTTP を使用して伝達され、普通は他のウェブに関する規格と共同した XML から構成されています。
  
この相互運用性(例えば、WindowsとLinuxアプリケーションの間など)はオープンスタンダードの運用によるものです。
+
様々なプログラミング言語で書かれ、様々なプラットホームで動くソフトウェアアプリケーションであっても、 Web サービスを利用することで、一つのコンピュータにおける内部処理と同様な方法でインターネットのようなコンピュータネットワーク越しでも、データの交換が可能になります。
OASISとW3Cはウェブサービスのアーキテクチャと標準化の策定に責任や権限がある主な委員会です。
 
  
ウェブサービス実装間の相互運用性を改良するため、WS-I委員会は、さらに定義する一連のプロフィールを規格の関連の開発をしています。
+
この相互運用性 (例えば、WindowsとLinuxアプリケーションの間など) はオープンな規格によってもたらされました。 OASIS と W3C は Web サービスのアーキテクチャと標準化に関して信頼できる主要な委員会です。
 +
また、 Web サービス実装間の相互運用性を改良するため、 WS-I 組織は、さらなる関連する標準を定義するために、一連のプロファイルを開発しています。
  
=== FPC & Lazarus のWeb Service Toolkit===
+
=== FPC & Lazarus のための Web サービスツールキット ===
[[Web Service Toolkit]] はFPCとLazarusのWEBサービスのパッケージです。
+
[[Web Service Toolkit]] は FPC と Lazarus のための WEBサービス のパッケージです。
  
== External Links ==
+
== 以下もご参照ください ==
 
+
* [[Portal:Web Development|Web Development Portal]]
'''XML'''
+
* [[Networking libraries|ネットワーキングライブラリ]] - 各種ネットワーキングライブラリの比較
 
+
* [http://brookframework.org Brook Framework] - 完全な Free Pascal による Web アプリケーションのためのフレームワークです。 純粋な Pascal からできており、Pascal ではない言語に悩まされる必要はありません。
* [http://www.w3schools.com/xml/default.asp W3Schools] Xml Tutorial
+
* [http://www.fastplaz.com FastPlaz] - Pascal のための Fast Web フレームワークです。 特徴として、theme/templating や simple Model、 セッション、メーラー などなど。
 +
* [[Sockets]] - TCP/IP ソケットコンポーネント
 +
* [[fcl-net]] - FPC に備え付けのネットワーキングライブラリ
 +
* [[Indy_with_Lazarus/ja]] - 多くの機能を持つネットワーキングライブラリのインストール方法
 +
* [[lNet]] - 軽量ネットワークコンポーネント
 +
* [[Synapse]] - シリアルポートとSerial port and synchronous TCP/IP ライブラリ
 +
* [[XML Tutorial/ja]] - XML はしばしばネットワーク通信で用いられます
 +
* [[FPC and Apache Modules]]
 +
* [[fcl-web]] - fpWeb という名前でも知られており、 cgi や fastcgi、apache のモジュールからなる Web アプリケーションを作るためのライブラリです。
 +
* [[Secure programming | セキュア・プログラミング]]
 +
* [[Internet Tools]] - Synapse/wininet/Android's httpcomponents simplifying https and redirections や ダウンロードされたページを処理するための XPath/XQuery/CSS セレクタ/JSON のエンジン などのラッパー

Latest revision as of 09:08, 21 February 2020

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) 한국어 (ko) polski (pl) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN)

日本語版メニュー
メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

このページは、Lazarus と 平易な FPC を用いたネットワークプログラムについての情報とチュートリアル/コードのページです。

(訳注:最初にこの元記事を書いた人はネットワークプログラミングの専門でなく、独学で勉強したことを書いているそうです)

TCP/IP プロトコル

Light bulb  Note: FPC/Lazarus には、ネットワーキングの機能を使うための様々なライブラリ(Synapse, lnet, fphttpclient, Indy,...)があるため、それらのライブラリに対して多くのサンプルコードが記述できるでしょう。 したがって、異なるライブラリに対しても同じサンプルコードを何度もみることになるかもしれません。 複数のネットワークライブラリの使用が可能なフレームワークの作り方の例について、 [1][2] フレームワークもご参照ください

CGI/FastCGI - REST, CRUD, チャットやブログ、ウェブページなど

これらの機能は fcl-web を使うことで可能となります。 また、 Brook フレームワーク( this page )でも実装されています。

SSH/Telnet クライアント、メールの送信、ファイルのダウンロードや OAuth v1.0 の例

Synapseのページをご覧ください。

Webサーバの例

以下は Synapse ライブラリを用いて記述した http サーバの例です。Mac OS Xでテストしました。ただし、Mac OS Xの socket ユニットでは定数 MSG_NOSIGNAL が定義されていないため、Synapse のソースに定数定義 MSG_NOSIGNAL = $20000 を追加してコンパイルしました(訳注 : 2010年9月現在SVNで流れている Synapse の新バージョンでは、上記の定数が追加されており、無修正でコンパイルできます)。

{
  マイクロ Pascal ウェブサーバ
 
  Synapseライブラリを用いた極単純なウェブサーバの実装例である。
 
  ブロッキングモードのソケットを用いた単一スレッドアプリケーションであるため
  複数のリクエストを並行して処理することはできない。

  ブラウザから受け取ったヘッダは標準出力に出力される。

  サービス可能なウェブページのURIは固定で、'/' のみである。
  ほかのURIに対しては '504 not found' を返す。
}
program upserver;

{$ifdef fpc}
  {$mode delphi}
{$endif}

{$apptype console}

uses
  Classes, blcksock, sockets, Synautil, SysUtils;

{@@
  コネクションに参加する。ヘッダを読み、しかるべき返信を行う
}
procedure AttendConnection(ASocket: TTCPBlockSocket);
var
  timeout: integer;
  s: string;
  method, uri, protocol: string;
  OutputDataString: string;
  ResultCode: integer;
begin
  timeout := 120000;

  WriteLn('Received headers+document from browser:');

  //リクエストラインを読み込む
  s := ASocket.RecvString(timeout);
  WriteLn(s);
  method := fetch(s, ' ');
  uri := fetch(s, ' ');
  protocol := fetch(s, ' ');

  //リクエストヘッダを読み込む
  repeat
    s := ASocket.RecvString(Timeout);
    WriteLn(s);
  until s = '';

  // ここで出力ストリームに文書を書き込む

  if uri = '/' then
  begin
    // 出力する文書をストリームに書く
    OutputDataString :=
      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
      + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + CRLF
      + '<html><h1>Teste</h1></html>' + CRLF;

    // ヘッダをクライアントに返信する
    ASocket.SendString('HTTP/1.0 200' + CRLF);
    ASocket.SendString('Content-type: Text/Html' + CRLF);
    ASocket.SendString('Content-length: ' + IntTostr(Length(OutputDataString)) + CRLF);
    ASocket.SendString('Connection: close' + CRLF);
    ASocket.SendString('Date: ' + Rfc822DateTime(now) + CRLF);
    ASocket.SendString('Server: Servidor do Felipe usando Synapse' + CRLF);
    ASocket.SendString('' + CRLF);

  //  if ASocket.lasterror <> 0 then HandleError;

    //文書をブラウザに送信する
    ASocket.SendString(OutputDataString);
  end
  else
    ASocket.SendString('HTTP/1.0 504' + CRLF);
end;

var
  ListenerSocket, ConnectionSocket: TTCPBlockSocket;
begin
  ListenerSocket := TTCPBlockSocket.Create;
  ConnectionSocket := TTCPBlockSocket.Create;

  ListenerSocket.CreateSocket;
  ListenerSocket.setLinger(true,10);
  ListenerSocket.bind('0.0.0.0','1500');
  ListenerSocket.listen;

  repeat
    if ListenerSocket.canread(1000) then
    begin
      ConnectionSocket.Socket := ListenerSocket.accept;
      WriteLn('Attending Connection. Error code (0=Success): ', ConnectionSocket.lasterror);
      AttendConnection(ConnectionSocket);
    end;
  until false;

  ListenerSocket.Free;
  ConnectionSocket.Free;
end.


FPC に備え付けの fcl-net コンポーネントを用いた TCP/IP クライアント-サーバ の例

ブログ記事における例をご覧ください。

HTTP ページのダウンロードや POST を用いたウェブサーバへのアップロード、external IP アドレスの取得

これらの例は、 fphttpclient#Examples で見つかります(FPC/Lazarus に備え付けの fphttpclient コンポーネントを使用した例です)。

Webサービス

W3C によると、 Web サービスとは ネットワーク越しに機械と機械を相互に利用できるように設計されたソフトウェアの名称です。

Web サービスは、 WSDL などのように 「機械が処理可能」 な形式で記述されているインタフェースを持ちます。 そのほかのシステムは、SOAP エンベロープに含まれるメッセージを使用したインタフェースによって定められた方法で、ウェブサービスと対話します。もしくは、RESTの原則に従うかもしれません。 これらのメッセージは、一般的に HTTP を使用して伝達され、普通は他のウェブに関する規格と共同した XML から構成されています。

様々なプログラミング言語で書かれ、様々なプラットホームで動くソフトウェアアプリケーションであっても、 Web サービスを利用することで、一つのコンピュータにおける内部処理と同様な方法でインターネットのようなコンピュータネットワーク越しでも、データの交換が可能になります。

この相互運用性 (例えば、WindowsとLinuxアプリケーションの間など) はオープンな規格によってもたらされました。 OASIS と W3C は Web サービスのアーキテクチャと標準化に関して信頼できる主要な委員会です。 また、 Web サービス実装間の相互運用性を改良するため、 WS-I 組織は、さらなる関連する標準を定義するために、一連のプロファイルを開発しています。

FPC & Lazarus のための Web サービスツールキット

Web Service Toolkit は FPC と Lazarus のための WEBサービス のパッケージです。

以下もご参照ください

  • Web Development Portal
  • ネットワーキングライブラリ - 各種ネットワーキングライブラリの比較
  • Brook Framework - 完全な Free Pascal による Web アプリケーションのためのフレームワークです。 純粋な Pascal からできており、Pascal ではない言語に悩まされる必要はありません。
  • FastPlaz - Pascal のための Fast Web フレームワークです。 特徴として、theme/templating や simple Model、 セッション、メーラー などなど。
  • Sockets - TCP/IP ソケットコンポーネント
  • fcl-net - FPC に備え付けのネットワーキングライブラリ
  • Indy_with_Lazarus/ja - 多くの機能を持つネットワーキングライブラリのインストール方法
  • lNet - 軽量ネットワークコンポーネント
  • Synapse - シリアルポートとSerial port and synchronous TCP/IP ライブラリ
  • XML Tutorial/ja - XML はしばしばネットワーク通信で用いられます
  • FPC and Apache Modules
  • fcl-web - fpWeb という名前でも知られており、 cgi や fastcgi、apache のモジュールからなる Web アプリケーションを作るためのライブラリです。
  • セキュア・プログラミング
  • Internet Tools - Synapse/wininet/Android's httpcomponents simplifying https and redirections や ダウンロードされたページを処理するための XPath/XQuery/CSS セレクタ/JSON のエンジン などのラッパー