External Communication Tools

Socket object

TCP接続は、インターネットの基本的なトランスポート層です。 Webブラウザーはサーバーに接続して新しいページを要求するたびに、TCP接続を開き、要求とサーバーの応答を処理します。JavaScript Socketオブジェクトを使用すると、インターネット上の任意のサーバーに接続し、このサーバーとデータを交換できます。

Socketオブジェクトは、TCP / IPネットワークまたはインターネットを介してリモートコンピューターに接続するための基本的な機能を提供します。接続を確立、終了するためのopen()やclose()、データを転送するためのread()、write()を提供します。listen()メソッドは、簡単なインターネットサーバーを確立します。サーバーはpoll()メソッドを使用して、着信接続を確認します。

これらの接続の多くはASCIIデータの単純なデータ交換に基づいていますが、FTPプロトコルなどの他のプロトコルはより複雑であり、バイナリデータが関係しています。最も単純なプロトコルの1つはHTTPプロトコルです。次のサンプルTCP / IPクライアントは、ポート80でリッスンするWWWサーバーに接続します。次に、非常に簡単なHTTP GETリクエストを送信して、WWWサーバーのホームページを取得します。そして、HTTP応答ヘッダーと一緒にホームページである応答を読み取ります。

reply = "";

conn = new Socket;


//アドビのホームページにアクセス

if (conn.open ("www.adobe.com:80")) {


// HTTP GETリクエストを送信

conn.write ("GET /index.html HTTP/1.0\n\n");


//サーバーの応答を読み取ります

reply = conn.read(999999);


conn.close();

}

このコードを実行すると、変数replyにはAdobeのホームページのコンテンツとHTTP応答ヘッダーが含まれます。

インターネットサーバーの確立はもう少し複雑です。典型的なサーバープログラムは、着信接続を待機して待機し、処理します。通常、着信接続要求を待つ無限ループでアプリケーションを実行したくないでしょう。したがって、ソケットオブジェクトに着信接続を要求し、すぐに戻ることができます。接続要求がある場合、poll()の呼び出しは、新しい接続を含む別のSocketオブジェクトを返します。この接続オブジェクトを使用して、呼び出しクライアントと通信します。終了したら、接続を閉じて接続オブジェクトを破棄します。

Socketオブジェクトが着信接続を確認する前に、HTTPリクエスト用のポート80などの特定のポートでリッスンするように指示する必要があります。これを行うには、open()メソッドの代わりにlisten()メソッドを呼び出します。

次の例は、非常に単純なWebサーバーです。ポート80でリッスンし、着信要求を検出するまで待機します。 HTTPヘッダーは破棄され、ダミーのHTMLページが呼び出し元に送信されます。

conn = new Socket;


//ポート80でリッスンします

if (conn.listen (80)) {


//接続を永遠に待ちます

var incoming;

do incoming = conn.poll();

while (incoming == null);


//リクエストを破棄します

conn.read();


// HTTPヘッダーで返信します

incoming.writeln ("HTTP/1.0 200 OK");

incoming.writeln ("Content-Type: text/html");

incoming.writeln();


//ダミーのホームページを送信します

incoming.writeln ("<html><body><h1>Homepage</h1></body></html>");


//完了!

incoming.close();

delete incoming;

}

多くの場合、リモートエンドポイントはデータの送信後に接続を終了します。したがって、接続がまだ存在している限り、trueを含むconnectedプロパティがあります。connectedプロパティがfalseを返す場合、接続は自動的に閉じられます。

エラーの場合、Socketオブジェクトのerrorプロパティには、エラーの種類を説明する短いメッセージが含まれます。

Socketオブジェクトを使用すると、インターネット経由で相互に通信するソフトウェアを簡単に実装できます。たとえば、JavaScriptプログラムを作成して実行するだけで、2つのAdobeアプリケーションでドキュメントとデータを交換できます。

Chat server sample

次のサンプルコードは、非常に単純なチャットサーバーを実装しています。 チャットクライアントは、ポート番号1234でリッスンしているチャットサーバーに接続します。サーバーはウェルカムメッセージで応答し、クライアントからの1行の入力を待ちます。クライアントはテキストを入力し、そのテキストを表示するサーバーに送信し、サーバーコンピューターのユーザーにテキスト行を入力させると、クライアントコンピューターは再び表示します。これは、サーバーまたはクライアントコンピューターのいずれかが「さようなら」という単語を入力するまで行き来します。

// ポート1234の単純なチャットサーバー

function chatServer() {

var tcp = new Socket;


//ポート1234でリッスンする

writeln ("Chat server listening on port 1234");

if (tcp.listen (1234)) {

for (;;) {

// 新しい接続をポーリングする

var connection = tcp.poll();

if (connection != null) {

writeln ("Connection from " + connection.host);


//新しい接続が確立されたので、クライアントがセッションを終了するまで歓迎し、チャットします

connection.writeln ("Welcome to a little chat!");

chat (connection);

connection.writeln ( "*** Goodbye ***");

connection.close();

delete connection;

writeln ("Connection closed");

}

}

}

}


function chatClient() {

var connection = new Socket;

// サンプルサーバーに接続する

if (connection.open ("remote-pc.corp.adobe.com:1234")) {

// その後、サーバーとチャット

chat (connection);

connection.close();

delete connection;

}

}


function chat (c) {

// 長いタイムアウトを選択します

c.timeout=1000000;

while (true) {

// 1行取得して表示する

writeln (c.read());


// 接続が切断されたら停止

if (!c.connected) break;


// テキスト1行を読む

write ("chat: ");

var text = readln();


// ユーザーが "bye" と入力した場合、会話を停止。それ以外の場合はサーバーに送信します

if (text == "bye") break;

else c.writeln (text);

}

}

コンストラクター

[new] Socket ();

新しいSocketオブジェクトを作成して返します。

プロパティ

connected

Boolean

trueの場合、接続はアクティブです。 読み取り専用。

encoding

String

データの送信に使用されるエンコーディングの名前を設定または取得します。 典型的な値は「ASCII」、「BINARY」、または「UTF-8」です。

eof

Boolean

trueの場合、受信バッファーは空です。 読み取り専用。

error

String

最新のエラーを説明するメッセージ。 この値を設定すると、エラーメッセージがクリアされます。

host

String

接続が確立されたときのリモートコンピューターの名前。 接続がシャットダウンされるか存在しない場合、プロパティには空の文字列が含まれます。 読み取り専用。

timeout

Number

読み取りまたは書き込み操作に適用されるタイムアウト(秒単位)。 デフォルトは10です。

関数

close()

Description

開いている接続を終了します。オブジェクトを削除すると接続も閉じますが、JavaScriptがオブジェクトをガベージコレクトするまで接続は閉じません。明示的に閉じない場合、接続は希望より長く開いたままになる場合があります。

接続が閉じられた場合はtrue、I / Oエラーの場合はfalseを返します。

listen (port [, encoding])

Description

port

Number。リッスンするTCP / IPポート番号。有効なポート番号は1〜65535です。

一般的な値は、Webサーバーの場合は80、Telnetサーバーの場合は23などです。

encoding

オプション。文字列。接続に使用されるエンコード。典型的な値は「ASCII」、「バイナリ」、または「UTF-8」です。デフォルトは「ASCII」です。

着信接続のリッスンを開始するようにオブジェクトに指示します。

open()とlisten()の呼び出しは相互に排他的です。 両方ではなく、いずれかの関数を呼び出します。

成功するとtrueを返します。

open (host [, encoding])

Description

host

文字列。 リモートコンピューターの名前またはIPアドレス、その後に続くコロン、および接続するポート番号。 ポート番号は必須です。有効なコンピューター名は、たとえば「www.adobe.com:80」または「192.150.14.12:80」です。

encoding

オプション。 文字列。 接続に使用されるエンコード。 典型的な値は「ASCII」、「バイナリ」、または「UTF-8」です。デフォルトは「ASCII」です。

読み取り/書き込み操作のために接続を開きます。

open()とlisten()の呼び出しは相互に排他的です。両方ではなく、いずれかの関数を呼び出します。

成功するとtrueを返します。

poll()

Description

新しい着信接続のリスニングオブジェクトをチェックします。 接続リクエストが検出された場合、メソッドは新しい接続を含む新しいSocketオブジェクトを返します。この接続オブジェクトを使用して、リモートコンピューターと通信します。 使用後、接続を閉じてJavaScriptオブジェクトを削除してください。 新しい接続リクエストが検出されなかった場合、メソッドはnullを返します。

Socketオブジェクトまたはnullを返します。

read ([count])

Description

count

オプション。Number。読み取る文字数。デフォルトは0です。負の場合、呼び出しはreadln()と同等です。

接続から指定された文字数まで読み取り、必要に応じて待機します。encodingがBINARYに設定されていない限り、CR文字を無視します。

指定した文字数、または接続が閉じられるかタイムアウトになるまでに読み取った文字列を返します。

readln()

Description

1行のテキストを次の改行まで読み取ります。改行はLFまたはCRLFが認識され、CRは無視されます。

文字列を返します。

write (text[, text...])

Description

text

文字列。任意の数の文字列値。すべての引数は連結されて、書き込まれる文字列を形成します。

すべての引数を1つの文字列に連結し、その文字列を接続に書き込みます。 CRLFシーケンスは、encodingがBINARYに設定されていない限り、LFに変換されます。

成功するとtrueを返します。

writeln (text[, text...])

Description

text

文字列。任意の数の文字列値。すべての引数は連結されて、書き込まれる文字列を形成します。

すべての引数を1つの文字列に連結し、改行文字を追加して、その文字列を接続に書き込みます。

成功するとtrueを返します。