[View] [Edit] [Attachments] [History] [Home] [Changes] [Search] [Help]

Squeak でネットワーク(クライアントソケット)

ここでは、Squeak での TCP ソケットの使い方を書きます。ソケットとは、まさに電灯のソケットの
ように他のコンピュータと接続する際の差込口の事です。電灯のソケットと同じく、受け側と
差す側があって、それぞれ受け側をサーバ、差す側をクライアントと言います。

Squeak では、ソケット以外にネットワークプログラミングのための便利な仕組みが沢山用意
されていますが、あえてこの原始的なソケットを使う理由としては以下の点があります。


単純なクライアント

いきなり完全なコードを示します。Workspace で以下を doIt すると、Transcript に www.yahoo.com
のコンテンツが出力されます。別に僕は yahoo の回し者では無いが、こういうサンプルに使える
URL が近頃めっきり減りました。
| sock crLf |
crLf := {Character cr. Character lf}.              "\r\n はお約束の改行コード"
sock := Socket newTCP.                             "TCP ソケットの作成"
sock connectToHostNamed: 'www.yahoo.com' port: 80. "www.yahoo.com の 80番ポートに接続"
sock sendData: 'GET / HTTP/1.0', crLf, crLf.        "リクエスト「/ の内容を下さい」"
Transcript show: sock receiveData.                 "内容をもらう"
sock close.

ソースを見れば何をしているのか大体分かると思います。

ソケットの特徴としては、書き込みも読み込みも同じオブジェクトを通して行う事が
あげられます(全2重)。そこで、双方がちゃんと話す順番を決めてその通りに通信を行わないと、
待ちぼうけ状態になってしまいます。たとえば、上の例では、crLf を一つ削除するだけで
ソケットは黙ってしまいます。

ポート番号の意味や HTTP プロトコルの詳細については他をあたってください。
トランスクリプトの出力を見ると気がつくと思いますが、この出力は途中で途切れています。
ソケットは接続とデータの送受信を行いますが、受け取ったデータを必要なだけ並べるのは
使う人の仕事です。

SocketStream を使ったクライアント

SocketStream を使うと、途切れないでデータを取ってくる事が簡単に出来ます。
SocketStream は、ソケットを Stream として扱います。Stream は Squeak の中で
よく使われるクラスで、前から順番にデータを読み書きするのに使います。
| sock |
sock := SocketStream openConnectionToHostNamed: 'www.yahoo.com' port: 80.
sock nextPutAll: 'GET / HTTP/1.0'; crlf; crlf. "リクエスト「/ の内容を下さい」"
sock flush.                                    "リクエストを実際に送る"
Transcript show: sock upToEnd.                 "最後まで内容をもらう"
sock close

flush というメソッドが来るまで実際にはリクエストが送られないのがポイントです。
SocketStream を使う事によって、ファイルや文字列の操作等のほかの Stream の操作と
同じやり方でデータを扱う事が出来るのが利点です。

Squeak でネットワーク(サーバソケット) に続く

Missing File (/propella/uploads/Across_Five_Aprils_-_A_Year_From_Now.mp3)
Missing File (/propella/uploads/Across_Five_Aprils_-_A_Year_From_Now.mp3)

Link to this Page

propella home