たくさん寝太郎の寝床

大阪在住大学生オタクのブログ

Lispの話(ソケットを使う)

こんにちは、たくさん寝太郎です。

最近何故か左顎が痛い。



前回「Lispではプログラム外のリソースとやりとりするのにストリームというデータ型を用いる」というのが出てきました。
今回は他のコンピュータと通信するのにストリームを使ってみます。


ソケットアドレス

ネットワーク上の別々のコンピュータで走っているプログラム同士がデータをやりとりするためのメカニズムをソケットと言います。
ネットワーク上のソケットには次の二つからなるソケットアドレスが割り当てられています。

ソケット上でメッセージを送る


鯖用とクライアント用の2つのCLISPを開きます。
鯖側でsocket-serverを使いポート番号を指定しソケット名を定義します。

(defparameter my-socket (socket-server 4321))

作ったソケットを鯖側にacceptさせます。

(defparameter my-stream (socket-accept my-socket))

次にクライアント側で鯖側のソケットに接続します。

(defparameter my-stream (socket-connect 4321 "127.0.0.1"))

127.0.0.1は現在のコンピュータ自身を指すIPアドレスです。2つ以上のコンピュータで通信する場合は鯖側のIPアドレスを書きます。

これでmy-stream変数がセットされ、鯖とクライアントが通信するためのストリームが作られました。


試しにクライアント側から鯖側にメッセージを送ってみます。

(print "oyasuminase" my-stream)  ;ON THE CLIENT
=>
"oyasuminase"

(read my-stream)  ;ON THE SERVER
=>
"oyasuminase"

逆に鯖側からクライアント側に送ることも同様に出来ます。


通信が終わった後は両側でストリームを閉じておきます。

(close my-stream)

次に鯖側でソケットを閉じます。
閉じておかないと再起動するまで指定したポートが使えなくなってしまいます。

(socket-server-close my-socket)


これで一連の流れが終了です。



応用情報でネットワークあたりの勉強はしましたがかなり知識が抜け落ちているのでもう一回勉強し直そうかなぁと思います。
LoLは次の13章でIII部が終わりです。頑張って読もうと思います。