2015.05.13
【Ruby】TCPサーバーを作る
扱いは簡単でよさげですね。
TCPサーバーのサンプルとしては以下の通り。
require "socket" port = 12345 #サーバー作成 sv = TCPServer.open( port ) #とりあえず無限ループ while true do #通信接続待ち puts "接続待機待ち" sock = sv.accept #アクセス先表示 puts "#{sock.peeraddr[3]}:#{sock.peeraddr[1]} から接続あり" begin #文字列を受け取る str = sock.gets puts "受け取り文字列:#{str}" #データを返す sock.write( str ) #ソケットを閉じる sock.close rescue #通信エラー puts "通信エラー発生" end end #サーバー終了 sv.close
・require "socket"
TCP通信は標準で組み込まれているらしいので
soketをrequireすれば使えるようになる。
・TCPServer.open
これでサーバーを作ります。
引数は待ち受けポート番号。
・sv.accept
acceptをするとアクセス待ちになります。
誰かからのアクセスがない限りacceptから戻ってくることはない。
なので別処理をしたいときには別スレッドに分ける必要がある。
戻り値としてソケットが返ってくるので
これで相手とのやり取りをする。
通信相手の情報はsock.peeraddrに入っている。
sock.peeraddr[3]にIP、sock.peeraddr[1]に返信ポートが書かれている。
・データの受け渡し
基本的に標準入出力と同じようにやりとりをする。
詳しくはSocketのドキュメントを参照。
Link:class Socket
今回は簡単に1行読んでそれをそのまま返す形にしている。
相手がまだデータを送ってない時や
受け取る準備ができてなかった時にはそこで処理がストップする。
これがTCP通信の利点ですね。
ここをスレッド化すれば通信対象への各自処理として
分離できるという感じでしょう。
・例外処理
データ等の送信が失敗すると例外が返される。
通信切断も通信をしたときに確認ができるみたいなので
例外処理は必須でしょう。
これだけだとデータのやり取りだけになってしまう。
ちゃんと使っていくのであればクライアントのやり取り(プロトコル)
をしっかりと決めないといけないでしょう。
関連記事