ソケット、プロセス、およびストリーム入出力
SenseTalkは、ソケット、プロセス、および標準入出力ストリーム(つまり、stdin、stdout、stderr)の読み書きのための一連のコマンド を提供します。基本的に、これらの形式はすべてデータストリームとして扱うことができます。 read
およびwrite
コマンドには、多くの形式の数字、テキスト、および生のバイナリデータを含む任意のタイプのデータを簡単に読み書きするための多くのオプションが含まれています。 HTTPとXML-RPCメッセージも直接サポートされており、インターネット上の多くのサーバーとの通信をさらに簡単にします。
ストリームの種類によって詳細が異なる場合がありますが、それらすべてを利用する基本的なプロセスは同じシーケンスに従います: open
、read
および/またはwrite
、close
。 このシーケンスの主な例外は、標準入力、標準出力、および標準エラーストリームは常に開いていると見なされるため、開くまたは閉じる必要がないことです。
ソケット、プロセス、ストリームデータを操作するために使用するコマンドと関数は、ファイルやファイルシステムオブジェク トを操作するために使用できるコマンドと関数に似ています。 ファイルおよびファイルシステムの操作についての情報については、File and Folder Interactionを参照してください。
ソケット入出力コマンド(open socket
、close socket
、read from socket
、およびwrite … to socket
)を使用すると、別のプロセスが提供するソケットへの接続を開き、その接続を通じてデータを読み書きすることができます。
同様に、プロセス入出力コマンド(open process
、close process
、read from process
、およびwrite … to process
)を使用すると、外部プロセスを起動し、そのプロセスの標準入力に書き込み、標準出力から読み取ることにより通信することができます。
read
およびwrite
コマンドはまた、標準入力から読み取り、標準出力または標準エラーストリームに書き込むためにも使用できます(read from input
、write … to output
、write … to error
)。
openSockets
関数と openProcesses
関数は、それぞれ現在開いているすべてのソケットまたはプロセスのリストを返します。
The DefaultStringEncoding
グローバルプロパティは、ファイルまたはソケットからテキストを読み取るか書き込むときに使用されるエンコーディング形式を制御します。
Open Socket
コマンド
動作: open socket
コマンドは、ソケットから何かを読み取るか、そのソケットにread
またはwrite
コマンドを使用して何かを書き込む前に使用する必要があります。ソケットの使用が終了したら、close socket
コマンドを使用して閉じる必要があります。
Open socket
は、別のプロセス(プログラム)へのTCPソケット接続を確立します。その他のプロセスは、同じコンピューター上で実行されているか、またはネットワーク上の他のコンピューター上で実行されている可能性があります。それはすでに実行されており、SenseTalkが接続できるソケットを登録している必要があります。接続が確立されると、データは両方の側が理解する方法でどちらの方向にも送信される可能性があります。
構文:
open socket socketIdentifier
_socketIdentifier_は、_host:port_の形式でなければなりません。ここで、_host_はマシンの名前またはIPアドレスであり、_port_は接続するソケットのそのマシンのポート番号です。
_socketIdentifier_は、任意の数値または識別子文字列に続くポンド記号#
(または垂直バー|
)文字で終わる場合があります。これは、同じホストとポートに対して複数の接続を確立し、各接続を一意に識別するための識別子を複数作成することを可能にします - 正しい接続を識別するためにread
、write
、およびclose
コマンドで適切な_socketIdentifier_を使用するだけです。
ソケット接続がthe readTimeout
グローバルプロパティで指定された時間内に確立できない場合、例外がスローされます。現在開いているすべてのソケットのリストを取得するためにopenSockets
関数を使用します。
例:
open socket remoteListener
例:
open socket "192.168.1.4:22"
例:
open socket "localhost:5900#2"
Open Process
コマンド
動作: 外部プロセスを起動し、スクリプトがその他のプロセスと対話できる接続を開きます。必要なのは外部プロセスを実行し 、そのプロセスが完了したときにそのプロセスからの出力を受け取ることだけであれば、shell
関数はそれを達成するためのはるかに簡単な方法を提供します。一方、オープンプロセスメカニズムは、スクリプトが他のプロセスと複雑な対話を行うことを可能にし、またはスクリプトをブロックせずに長時間の操作を開始し、その操作の結果をスクリプトの後の時点で取得することを可能にする、はるかに大きな柔軟性を提供します。
Open process
は、他のプログラムを実行するためのシェルである可能性が最も高い(そして最も一般的な)別のプロセス(プログラム)を起動します。他のプロセスが起動されると、接続が確立され、テキストはどちらの方向にも送信できます - スクリプトは他のプロセスの標準入力に書き込み、そのプロセスの標準出力から読み取ることができます。
プロセスが起動できない場合、result関数は例外に設定されます(
The ThrowExceptionResultsグローバルプロパティがtrueに設定されている場合、例外がスローされます)。現在開いているすべてのプロセスのリストを取得するためにopenProcesses`関数を使用できます。
構文: open process processIdentifier {with {options} options}
_processIdentifier_は_processPath#identifier_の形であるべきです。ここで_processPath_は実行するプロセスのフルパスです。_processPath_が省略された場合、シェルプロセスが起動されます(the shellCommand
グローバルプロパティによって指定されます)。#_identifier_部分もオプションです - これは_processIdentifier_を一意にする方法として機能し、スクリプトが同じ_processPath_を使用する複数のプロセスを同時に開いて対話することができます。
_options_が使用される場合、それはこれらのプロパティを含む可能性があるプロパティリストであるべきです:
parameters | プロセスが起動されたときにそのプロセスにパラメータとして渡される値のリスト |
folder またはdirectory | プロセスが実行される現在のディレクトリ |
environment | 環境変数とその値を指定するプロパティリスト |
例:
open process preferredShell & "#myshell"
例:
open process "/bin/sh" with options myOptions
例:
open process "/usr/local/bin/mysql#2"
Close Socket
, Close Process
, Close All
コマンド
動作: ソケットを閉じる、またはプロセスを閉じる、またはすべての開いているファイル、ソケット、またはプロセスを閉じる。 close all sockets
コマンドは現在開いているすべてのソケットを閉じます、どのスクリプトまたはハンドラがソケットを開いたかに関係なく。この動作は他のスクリプトがソケットを開いており、まだ使用中の場合に問題を引き起こす可能性があります。 openSockets()
関数を使用して開いているすべてのソケットのリストを取得します。同じことがclose all processes
コマンドにも当てはまります。
close socket
コマンドは、以前open socket
コマンドで開いたソケットを閉じます。 _socketIdentifier_はソケットを開くときに使用した識別子と同一でなければなりません。
close process
コマンドは、以前open process
コマンドで開いたプロセスを閉じます。 _processIdentifier_はプロセスを開くときに使用した識別子と同一でなければなりません。
close all sockets
およびclose all processes
コマンドは現在開いているすべてのソケットま たはプロセスを閉じるために使用できます。SenseTalkはスクリプトの実行が停止するたびに自動的にすべての開いているソケットとプロセスを閉じますが、スクリプトがそれらの操作を終えたときにそれらを閉じることは良い習慣です。
構文:
close socket socketIdentifier
close process processIdentifier
close all sockets
close all processes
例:
close all processes -- open all processesを閉じる
例:
close socket "localhost:5900"
例:
close process "#9"
Read from Socket
, Read from Process
, Read from Input
コマンド
動作: 開いているソケットまたは開いているプロセス、または標準入力ストリームからデータ(テキストまたは数字)を読み取ります。
read from ...
コマンドを使用してソケット、プロセス、または標準入力からデータを読み取ります。データは変数it
または指定された目的のコンテナ(into
句を使用して)に読み込まれます。これ以上読み取るデータがない場合、目的のコンテナは空になります。要求された量より少ないデータが読み取られると、result
関数は理由(たとえばtime out
)を示す値を含むようになります。
read
コマンドは、指定された数の文字、単語、アイテム、行、またはバイトを読み取ることができます。指定された区切り文字が見つかるまで読み取ることもできます。または、いくつかの異なるタイプの数値値のリストを読み取ることもできます。読み取りは現在の位置から始まります。readコマンドの構文は柔軟で、さまざまなオプションを任意の便利な順序で指定できます。
ファイルから読み取るには、Read from File Commandを参照してください。
構文:
read Options
Source Options: 必須.
from socket socketIdentifier
from process processIdentifier
from [input | stdin]
Quantity Options: オプション。一度に一つだけ使用できます.
until [ {the} eof | {the} end {of {the} file} | terminator]
for quantity {dataType}
[a | an | quantity] dataType
{for} {a | an} http {message | request | response}
{for} {a | an} [xmlrpc | xml-rpc] {message | request | response}
その他のオプション: オプション。一度に複数使用できます。
at startPos
[ in | [timeout | time out] {after | in} ] timeoutDuration
into container
三つのfromオプションの一つは必須で、読み取り元を指定する必要があります。他のすべてのオプションはオプションですが、各タイプは一つだけ指定可能です。forオプションもuntilオプションも指定されていない場合、単一バイトが読み取られます。into _container_が指定されていない場合、値は特別なit
変数.に読み取られます。
標準入力ストリームを開く必要はありません - それは常に開いています(あなたが好むならば、stdin
としてinput
の代わりに参照することができます)。
ソケットから読み取る場合、_socketIdentifier_表現は、以前にopen socket
コマンドでソケットが開かれたときに使用された正確な識別子を生成する必要があります。
プロセスから読み取る場合、_processIdentifier_表 現は、以前にopen process
コマンドでプロセスが開かれたときに使用された正確な識別子を生成する必要があります。読み取られる値は、プロセスからの標準出力に対応します。
into _container_が指定された場合、読み取られたデータは指定されたコンテナに入れられます。intoオプションが指定されていない場合、データは特別なit
変数に読み取られます。
until _terminator_が指定されている場合、指定された文字または文字列の次の出現までのすべての文字が読み取られます。これは、ソースから一行ずつ読み取るのに便利です(終端文字としてreturn
を使用することで)、または他の区切り文字(tab
など)まで読み取ります。_terminator_は長さが一文字以上の場合もあり、読み取った値の一部として返されます。until eofまたはuntil endを指定すると、ファイルの終わりまで、またはソケットまたはストリームからの入力の終わりまで読み取ります。標準入力ストリームは、Control-D文字が受信された後に終わりに達したことを示します。ソケットとプロセスの場合、until eofまたはuntil endオプションは、入力が利用可能になるか、またはthe readTimeout
またはin _timeLimit_の期間が経過するまで待ちます(後述)。これにより、入力が予期されるときの読み取りが大幅に簡素化されます。
for _quantity dataType_が使用される場合、_quantity_に指定された文字数または他のデータ要素がファイルから読み取られます。_dataType_がテキストチャンクタイプ(characters
、words
、items
、またはlines
)の場合、要求された量が利用可能になるまでテキストが読み取られます。最後の区切り文字(ある場合)は、読み取られたテキストには含まれません。_dataType_が指定されていない場合、バイトが仮定されます(この場合、for
が必要です)。
in _timeoutDuration_オプションは、read
コマンドが要求されたデータを利用可能にするのを待つ最大時間を提供します。時間が指定されていない場合、the readTimeout
のグローバルプロパティの値が代わりに使用されます。要求されたデータがtimeLimitまたはreadTimeoutで指定された時間内に読み取られない場合、読み取られたものは返され、the result
関数は_time out_を示すように設定されます。
テキストチャンクタイプの代わりに数値_dataType_を指定すると、読み取りによってit
または_container_に格納される値は、読み取られたデータ値のリストになります。以下の数値データタイプを使用することができます。
DataType | Value |
---|---|
int1 または8-bit integer | 8ビット(または1バイト)の符号付き整数 |
uint1 またはunsigned 8-bit integer | 8ビット(または1バイト)の符号なし整数 |
int2 または16-bit integer またはshort integer | 16ビット(または2バイト)の符号付き整数 |
uint2 またはunsigned 16-bit integer | 16ビット(または2バイト)の符号なし整数 |
int4 または32-bit integer またはinteger | 32ビット(または4バイト)の符号付き整数 |
uint4 またはunsigned 32-bit integer | 32ビット(または4バイト)の符号なし整数 |
int8 または64-bit integer | 64ビット(または8バイト)の符号付き整数 |
uint8 またはunsigned 64-bit integer | 64ビット(または8バイト)の符号なし整数 |
real4 または32-bit real またはfloat | 32ビット(単精度)の浮動小数点数 |
real8 または64-bit real またはdouble | 64ビット(倍精度)の浮動小数点数 |
例:
read from input until return-- ユーザーが入力したテキストを読む
例:
read from process mysql until end -- 利用可能なテキストを読む
例:
read into numList from socket inStream for3 unsigned integers
例:
read 6 unsigned 8-bit integers from socket rfb into unitSales
例:
read 10 chars from socket "192.168.1.4:22" in 15 seconds
関連項目:
Read from File Command
: ファイルから読み取るためにこれを使用します。
Write to Sockets
, Write to Process
, Write to Output
, Write to Error
コマンド
動作: データをソケットやプロセスに書き込む、または標準出力や標準エラーストリームに書き込む。_Data_は有効なSenseTalk表現であれば何でも可能です。_dataType_が指定されていない場合、_data_表現の値は文字列として扱われ、指定されたソケットやストリームに書き出されます。
_socketIdentifier_表現は、open socketコマンドで以前に開かれたソケットの識別子を生成しなければなりません。
_processIdentifier_表現は、open processコマンドで以前に開かれたプロセスの識別子を生成しなければなりません。書き込まれたデータは、プロセスの標準入力に送信されます。
as _dataType_が指定されている場合、データは書き込み前にそのバイナリ形式に変換されます。この場合、_data_は数値のリストであり、すべて同じデータタイプに変換されます。有効なデータタイプのリストについては、read
コマンドを参照してください。
構文:
write data {as dataType} to socket socketIdentifier
write data {as dataType} to process processIdentifier
write data {as dataType} to [output | stdout | error | stderr]
例:
write "ls -l" & return to process "#4"
例:
write "Pleaseenter your account id: " to output
例:
write [2,3,5,9] as 8-bit integers to socket msock
OpenSockets
関数
動作: open socket
コマンドの結果として現在開いている全てのソケットのリストを返します。
構文:
openSockets()
the openSockets
例:
repeat with each item of the openSockets
if it begins with "192.168.1.12:" then close socket it
end repeat
OpenProcesses
関数
動作: open process
コマンドの結果として現在開いている、そして対話可能な全てのプロセスのリストを返します。
Syntax:
openProcesses()
the openProcesses
例:
repeat with each item of the openProcesses
if it begins with "/usr/bin/ssh" then
write "logout" & return to process it
end if
end repeat