質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1167閲覧

Ruby socket クライアントと接続したらloop処理を終了させる方法

kazuyakazuya

総合スコア193

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/08/19 02:55

編集2019/08/19 03:01

Rubyのsocketでコマンドをやりとりするプログラムを作りました。
サーバーが起動しクライアントが接続してくるまで
カウントダウンをしたいのですが
接続したときにカウントダウンを終了させる方法を知りたいです。

カウントダウン処理

ruby

1loop do 2 keep_time = Time.now 3 print keep_time,"\r" 4 break if ここに何かしらを入れて処理を終わらせたい。 5end

元のプログラム

server

1#! ruby -Ku 2require "kconv" 3require 'socket' 4require 'time' 5 6gate = TCPServer.open("55555") 7#ここらへんにカウントダウン処理を入れる 8sock = gate.accept#相手と接続したらカウント処理を終わらせたい 9puts "クライアントが起動しました。" 10gate.close 11 12#ここから下はたぶん関係ない 13until(cmd = sock.gets) == "EOF\n" 14puts(Kconv.tosjis(cmd)) 15end 16puts "コマンドを入力してください。" 17while msg = STDIN.gets 18 sock.write(msg) 19 until(cmd = sock.gets) == "EOF\n" 20 puts(Kconv.tosjis(cmd)) 21 end 22end 23sock.close 24

一応クライアントも

client

1#! ruby -Ku 2require "kconv" 3require 'socket' 4#ipconfigを実行し結果を投げる 5sock = TCPSocket.open("localhost","55555") 6 7sock.write(`ipconfig`) 8sock.puts("EOF") 9#受け取ったコマンドを実行する。 10while cmd = sock.gets 11 sock.write(`#{cmd}`) 12 sock.puts("EOF") 13end 14sock.close 15

カウント処理を入れると

server

1#! ruby -Ku 2require "kconv" 3require 'socket' 4require 'time' 5 6gate = TCPServer.open("55555") 7loop do 8 keep_time = Time.now 9 print keep_time,"\r" 10 break if sock = gate.accept 11end 12 13puts "クライアントが起動しました。" 14gate.close 15 16until(cmd = sock.gets) == "EOF\n" 17puts(Kconv.tosjis(cmd)) 18end 19puts "コマンドを入力してください。" 20while msg = STDIN.gets 21 sock.write(msg) 22 until(cmd = sock.gets) == "EOF\n" 23 puts(Kconv.tosjis(cmd)) 24 end 25end 26sock.close

実行結果

cmd

12019-08-19 11:49:14 +0900

これっきり止まります。

accept自体がクライアントが接続している以前に実行されるので
すぐにbreakされてしまいます。
リファレンス
クライアントが接続しているかどうかを確かめるメソッドとか
ないでしょうか?
イメージ説明

分からないので参考になるリンクまたは説明をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2019/08/19 05:22 編集

あなたの実行時の環境(OS)、rubyのバージョンを明記してください。 こちらで確認すると、あなたと同じように、2019-08-19 11:49:14 +0900 を表示した あと、止まりましたが。 こちら、windows7の環境ですが、ファイアーウオールを無効にして実行すると、クライアントからの 要求を受け付けるところまでは、進みました。(別のエラーになりましたが) こちらのrubyのバージョンです。 D:\goo\ruby\goo_socket>ruby -v ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
kazuyakazuya

2019/08/19 09:55

ありがとうございます。 rubyの実行環境は2.4です。 (受け付けることができたのですが同じくこちらでもエラーになりました。)
guest

回答1

0

ベストアンサー

そのメソッドが終了する(帰ってくる)条件は何かを考えましょう。

案1:
カウントダウンとacceptを別のスレッドで実行する。

案2:
IO.selectを使う。

投稿2019/08/19 05:35

otn

総合スコア84529

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/08/19 09:56

ありがとうございます。 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問