|
setup diary |
LANを介してデータのやり取りをする必要があったので、rubyのsocketを使って、必要なプログラムを書いた。通常は一つのサーバーに複数のクライアントが何回も接続することが想定されるので、threadを使うことが多い。しかし、今回は一つのクライアントが一度だけ接続するというケースだったので、threadが必要が無いことに気がついたので、以下のように単純化した。
serv=TCPServer.open(2051) cl=serv.accept str=cl.readpartial(10) cl.close serv.close
acceptでclientが接続するまで待ってくれる。クライアント側は、TCPSocket.open("localhost",2051)で接続して、読み書きすれば良い。
ふと、これをRでできないかを考えてみた。クライアント側は、以下のように、socketを開けて、読み書きすれば良い。
tcp<-socketConnection("localhost",2051) write("123",tcp) cat("123",file=tcp) readLines(tcp,n=1) close(tcp)
サーバーもやってみたら簡単だった。
tcp<-socketConnection(port=2051,server=TRUE) close(tcp)
定義するときに、クライアントが接続するまで待ってくれるので、クライアント側とほとんど同じ書き方で、サーバー側のプログラムも書けてしまう。ただ、複数のクライアントが接続する場合は面倒そうだ。
Rでrubyと同様にsocketを用いた通信ができそうだが、違いがある。rubyではreadpartialでは、データが来るまで待ってくれるが、RだとreadBinとかでは、データがなかったら読まずに終わってしまう。特定の長さのデータを読み込みたいときには、rubyではread(length)とすれば良いが、Rでは長さを指定しても、それよりも短いデータしか読み込まない可能性があるので、読み込んだデータを数えて、特定の長さになるまで繰り返さないといけない。これは面倒だが、何か楽に固定長を読み込む方法は無いのかな。