インターネット上のファイルを取得する

数学にしか取り柄のない言語っぽいけどそうじゃないよ!っていうのを示す記事。

ファイル取得への道のり

まずはネットワーク用のライブラリをロードする。

   load 'socket'
   coinsert 'jsocket'

loadでライブラリを読んでいる。coinsertはusing namespaceみたいなもの。

次にソケットをつくる。

   sk =: 0 pick sdcheck sdsocket ''

sdsocketでソケットを作って、sdcheckでエラーチェックをしている。pickはデータ列から特定の場所のデータを取り出す動詞。

次にウェブサーバに接続する。ここではJの開発元であるJsoftware接続テスト用のテキストファイルを用意してくれているのでそれを取得する。

   jsoft =: sdcheck sdgethostbyname 'www.jsoftware.com'
   sdcheck sdconnect sk; jsoft,<80

一行目ではホスト名からIPなどの情報を取得する。二行目ではその情報を元にサーバのポート80に接続している。

そしてHTTPのリクエストを送信する。

   sdcheck ('GET /download/testsock.txt', CR, LF) sdsend sk, 0

後は受信すればおk。

   text =: ; sdcheck sdrecv sk,1000,0

sdrecvを使ってサーバからの返答を受信する。ここでは最大1000バイトまで読むことにしてある。

最後に接続を終わらせておく。

   sdcheck sdclose sk

中身を確認。

   text
Congratulations!  This is the contents of the file:
  http://www.jsoftware.com/download/testsock.txt

まとめ

   load 'socket'
   coinsert 'jsocket'

   sk =: 0 pick sdcheck sdsocket ''

   jsoft =: sdcheck sdgethostbyname 'www.jsoftware.com'
   sdcheck sdconnect sk; jsoft,<80

   sdcheck ('GET /download/testsock.txt', CR, LF) sdsend sk, 0
   text =: ; sdcheck sdrecv sk,1000,0
   sdcheck sdclose sk