Rubyのsocketを使ってクライアントからサーバーへコマンドを投げて
実行結果を表示するプログラムを作っています。
server
1#! ruby -Ku 2require "kconv" 3require 'socket' 4 5gate = TCPServer.open("55555") 6sock = gate.accept 7gate.close 8while cmd = sock.gets 9 puts(Kconv.tosjis(cmd)) 10 break if cmd == nil 11end 12sock.close 13
client
1#! ruby -Ku 2require "kconv" 3require 'socket' 4#ipconfigを実行し結果を投げる 5sock = TCPSocket.open("localhost","55555") 6sock.write(`ipconfig`) 7sock.close
問題なのはサーバー側のプログラムのここです。↓
ruby
1while cmd = sock.gets 2 puts(Kconv.tosjis(cmd)) 3 break if cmd == nil 4end
これはクライアント側文字列を受け取っています。
クライアント側から文字列をすべて受け取り切ったら
ruby
1break
を発動させ
ruby
1while
の処理を終わらせたいのですがどうすればよいのでしょうか?
ここでは
ruby
1break if cmd == nil
このように書いていますが、うまく作動してくれません。
すべて受け取り切ったら終了させたいのですが
その方法が全く思いつきません。
なにか良い方法はないでしょうか?
分からないので参考になるリンクまたは説明をお願いします。
追記
server
1#! ruby -Ku 2require "kconv" 3require 'socket' 4 5gate = TCPServer.open("55555") 6sock = gate.accept 7gate.close 8while cmd = sock.gets 9 puts(Kconv.tosjis(cmd))#ここはipconfigを表示する処理。 10end 11 12 13 14 15#コマンドを相手へ投げる。 16while msg = STDIN.gets 17 sock.write(msg) 18 while cmd = sock.gets#注意! ここはしっかり動作するかまだ立証していない 19 puts cmd #クライアントへ投げた文字列(実行したいコマンド)の結果をサーバー側で表示するための処理です。 20 end #注意! ここはしっかり動作するかまだ立証していない 21end 22sock.close 23
client
1#! ruby -Ku 2require "kconv" 3require 'socket' 4#ipconfigを実行し結果を投げる 5sock = TCPSocket.open("localhost","55555") 6sock.write(`ipconfig`) 7 8 9 10#受け取ったコマンドを実行する。 11while cmd = sock.gets 12 sock.write(`#{cmd}`)#注意! ここはしっかり動作するかまだ立証していない 受け取ったコマンド結果をサーバー側へ返す処理。 13end 14sock.close 15
大変わかりずらいですが
今回やっていること
1 クラアントがサーバーへipconfigの結果を投げる
2 サーバー側が受けと取り、結果を表示させたら
今回はサーバー側からクライアントへコマンドを実行するための文字列を投げる。
起こっていること
実行すると
#クライアントを実行
client
1C:\Users\matsu\Desktop\ruby_lesson>ruby client.rb 2
#サーバーを実行。
server
1・・・ 2・・・上記省略 3Wireless LAN adapter Wi-Fi: 4 5 接続固有の DNS サフィックス . . . . .: tcn-catv.ne.jp 6 リンクローカル IPv6 アドレス. . . . .: fe80::3908:b55c:8d55:59f2%18 7 IPv4 アドレス . . . . . . . . . . . .: 192.168.11.9 8 サブネット マスク . . . . . . . . . .: 255.255.255.0 9 デフォルト ゲートウェイ . . . . . . .: 192.168.11.1 10 11イーサネット アダプター Bluetooth ネットワーク接続: 12 13 メディアの状態. . . . . . . . . . . .: メディアは接続されていません 14 接続固有の DNS サフィックス . . . . .: 15#!ipconfigを表示したら本来ここから文字を打てる(クライアントへ投げるコマンド)はずだが 16打っても反応がない。!
要約すると
ipconfigを実行したクライアントがサーバーへ投げるところまで
はうまく作動している。
ただ、ipconfigの結果を表示し終えたところで文字の入力を受け付けていると思いきや
打っても反応がない。
今回の質問内容の場所に問題があるのかと思ったのですが
otnさんの指摘の通り
今回のwhileに問題はありませんでした。
どこに原因があるのでしょうか?・・・
さらに追記
whileに問題ないと書きましたが
breakしたところ次に処理が移ったので
やはりwhileに問題があるのかと思われます。
server
1#! ruby -Ku 2require "kconv" 3require 'socket' 4require 'time' 5 6gate = TCPServer.open("55555") 7sock = gate.accept 8gate.close 9 10while cmd = sock.gets 11 until(cmd = sock.gets) == "\004" 12 puts(Kconv.tosjis(cmd)) 13end 14 15while msg = STDIN.gets 16 sock.write(msg) 17 while cmd = sock.gets 18 puts(Kconv.tosjis(cmd)) 19 end 20end 21sock.close 22
client
1#! ruby -Ku 2require "kconv" 3require 'socket' 4#ipconfigを実行し結果を投げる 5sock = TCPSocket.open("localhost","55555") 6 7sock.write(`ipconfig`) 8sock.puts("\004") 9#受け取ったコマンドを実行する。 10while cmd = sock.gets 11 sock.write(`#{cmd}`) 12 13end 14sock.close
server
1 2Wireless LAN adapter Wi-Fi: 3 4 接続固有の DNS サフィックス . . . . .: tcn-catv.ne.jp 5 リンクローカル IPv6 アドレス. . . . .: fe80::3908:b55c:8d55:59f2%18 6 IPv4 アドレス . . . . . . . . . . . .: 192.168.11.9 7 サブネット マスク . . . . . . . . . .: 255.255.255.0 8 デフォルト ゲートウェイ . . . . . . .: 192.168.11.1 9 10イーサネット アダプター Bluetooth ネットワーク接続: 11 12 メディアの状態. . . . . . . . . . . .: メディアは接続されていません 13 接続固有の DNS サフィックス . . . . .: 14EOF 15
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/18 05:33 編集
2019/08/18 05:47
2019/08/18 06:38
2019/08/18 06:41
2019/08/18 06:46
2019/08/18 06:51
2019/08/18 06:54
2019/08/18 06:58
2019/08/18 08:19 編集
2019/08/18 10:45
2019/08/18 11:44
2019/08/18 11:55 編集
2019/08/18 11:56
2019/08/18 12:00
2019/08/18 12:08
2019/08/18 12:13
2019/08/18 12:33
2019/08/18 12:42
2019/08/18 12:45