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

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

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

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

1回答

2159閲覧

TCPServer側で接続されたことを知りたい

akamakku

総合スコア191

Ruby

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

2グッド

1クリップ

投稿2016/12/08 08:05

編集2016/12/08 10:12

サーバに接続したら問題が出されるようなサーバプログラムを書いてみようと思ったのですが、うまく行きません。

サーバ側でCtrl+Cをした時に問題が送られてきます。
クライアントが接続してきた時にサーバ側からメッセージを送ることはできるんでしょうか?

Ruby

1#client_side 2require 'socket' 3 4addr = "192.168.33.11" 5port = 20000 6 7sock = TCPSocket.open(addr, port) 8 9while true 10 print sock.gets 11 print sock.gets 12 sock.write gets 13end

Ruby

1#server_side 2require 'socket' 3 4port = 20000 5 6gate = TCPServer.open(port) 7sock = gate.accept 8loser = false 9 105.times do |i| 11 a = rand(100)+1 12 b = rand(100)+1 13 14 sock.write "\##{i+1}" 15 sock.write "#{a}+#{b} = ?" 16 if (a+b) == sock.gets.to_i then 17 sock.write "collect!" 18 else 19 sock.write "You are loser!\nSee you" 20 loser = true 21 break 22 end 23end 24 25if loser then 26else 27 sock.write "Excellent!\nYou are Winner!!!" 28end 29 30sock.close 31gate.close 32

ちなみにIPアドレスはVagrantのものです。

kazuyakazuya, takeru7584👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

sock.getsは、サーバーから\nが送られてくるまで待ちますよ。

sock.write "##{i+1}"

sock.write "#{a}+#{b} = ?"

だと、\nが送られてこないので、getsが完結しません。

サーバーからの送信終わりを\0で表すことにして、他にも少し書き直すと、

Ruby

1#client_side 2require "socket" 3 4addr = "192.168.33.11" 5port = 20000 6 7sock = TCPSocket.open(addr, port) 8 9while true 10 print sock.gets("\0") 11 sock.write gets 12 print ans=sock.gets("\0") 13 break if /You are/ =~ ans 14end

Ruby

1#server_side 2require "socket" 3 4port = 20000 5 6gate = TCPServer.open(port) 7sock = gate.accept 8 9N=5 10N.times do |i| 11 a = rand(100)+1 12 b = rand(100)+1 13 14 sock.write "\##{i+1}: " 15 sock.write "#{a}+#{b} = ?" 16 sock.write "\0" 17 if (a+b) == sock.gets.to_i then 18 sock.write "collect!\n" 19 sock.puts "Excellent!\nYou are Winner!!!" if i==N-1 20 sock.write "\0" 21 else 22 sock.puts "You are loser!\nSee you" 23 sock.write "\0" 24 break 25 end 26end 27 28sock.close 29gate.close

投稿2016/12/08 13:38

otn

総合スコア84423

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

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

akamakku

2016/12/08 13:55

なるほど!! 丁寧に直していただきありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問