From def12ca9a209686fd1b9910947a9f653f5b42c5f Mon Sep 17 00:00:00 2001 From: kei-kmj <82737807+kei-kmj@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:46:59 +0900 Subject: [PATCH] Hit a real web server with a TCP client --- .gitignore | 7 ++ .rubocop.yml | 8 ++ .ruby-version | 1 + Gemfile | 6 ++ Gemfile.lock | 38 +++++++++ TCP/TcpClient.rb | 46 ----------- TCP/tcp_client.rb | 47 +++++++++++ TCP/{TcpServer.rb => tcp_server.rb} | 117 ++++++++++++++-------------- client_recv.txt | 1 - client_send.txt | 1 - server_recv.txt | 1 - server_send.txt | 1 - 12 files changed, 166 insertions(+), 108 deletions(-) create mode 100644 .rubocop.yml create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock delete mode 100644 TCP/TcpClient.rb create mode 100644 TCP/tcp_client.rb rename TCP/{TcpServer.rb => tcp_server.rb} (70%) delete mode 100644 client_recv.txt delete mode 100644 client_send.txt delete mode 100644 server_recv.txt delete mode 100644 server_send.txt diff --git a/.gitignore b/.gitignore index e69de29..6325173 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,7 @@ +.idea/ +/client_recv.txt +/client_send.txt +/server_recv.txt +/server_send.txt +/.env +/vendor/ diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..e4151e7 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,8 @@ +AllCops: + NewCops: enable + +Style/Documentation: + Enabled: false + +Lint/AssignmentInCondition: + Enabled: false diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..be94e6f --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.2.2 diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..29f6e14 --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gem 'dotenv' +gem 'rubocop' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..7076804 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,38 @@ +GEM + remote: https://rubygems.org/ + specs: + ast (2.4.2) + dotenv (2.8.1) + json (2.6.3) + parallel (1.23.0) + parser (3.2.2.3) + ast (~> 2.4.1) + racc + racc (1.7.1) + rainbow (3.1.1) + regexp_parser (2.8.1) + rexml (3.2.5) + rubocop (1.52.1) + json (~> 2.3) + parallel (~> 1.10) + parser (>= 3.2.2.3) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.28.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.29.0) + parser (>= 3.2.1.0) + ruby-progressbar (1.13.0) + unicode-display_width (2.4.2) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + dotenv + rubocop + +BUNDLED WITH + 2.4.13 diff --git a/TCP/TcpClient.rb b/TCP/TcpClient.rb deleted file mode 100644 index b28d72b..0000000 --- a/TCP/TcpClient.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'socket' - -# tcpクライエントクラス -class TcpClient - # 初期化 - def initialize - @client = TCPSocket.open("localhost", 8001) - end - - def run - send("client_send.txt") - recv - close - end - - private - - def send(_data) - # client_send.txtの内容をサーバーに送信する - File.open("client_send.txt", "r") do |f| - while line = f.gets - @client.puts(line) - end - end - # サーバーに0を送信する - @client.puts("0") - end - - def recv - # サーバーからのデータを受信する - File.open("client_recv.txt", "w") do |f| - while line = @client.gets - f.write(line) - end - end - end - - def close - # サーバーに0を送信する - @client.close - end -end - -# クライアントの起動 -client = TcpClient.new -client.run \ No newline at end of file diff --git a/TCP/tcp_client.rb b/TCP/tcp_client.rb new file mode 100644 index 0000000..799ab43 --- /dev/null +++ b/TCP/tcp_client.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'socket' +require 'dotenv' +Dotenv.load + +# tcpクライエントクラス +class TcpClient + # 初期化 + def initialize + @client = TCPSocket.new(ENV.fetch('WEBSITE', nil), 80) + end + + def run + send + recv + close + end + + private + + def send + request = "GET / HTTP/1.1\r\n" + request += ENV.fetch('HOST', nil) + request += "Connection: close\r\n\r\n" + + @client.puts(request) + end + + def recv + # サーバーからのデータを受信する + File.open('client_recv.txt', 'w') do |f| + while (line = @client.gets) + f.puts(line) + end + end + # @client.puts('0') + end + + def close + @client.close + end +end + +# クライアントの起動 +client = TcpClient.new +client.run diff --git a/TCP/TcpServer.rb b/TCP/tcp_server.rb similarity index 70% rename from TCP/TcpServer.rb rename to TCP/tcp_server.rb index 0aafce3..938b0d5 100644 --- a/TCP/TcpServer.rb +++ b/TCP/tcp_server.rb @@ -1,58 +1,59 @@ -require 'socket' - -# tcpサーバークラス -class TcpServer - # 初期化 - def initialize - @server = TCPServer.open(8001) - @client = nil - end - - def run - accept - recv - send("server_send.txt") - close - end - - private - - def accept - puts "waiting for connection..." - # クライアントからの接続を待つ - @client = @server.accept - end - - # クライアントからのデータを受信する - def recv - puts "connected" - # 受け取った内容をsever_recv.txtに書き込む - File.open("server_recv.txt", "w") do |f| - while line = @client.gets - break if line.chomp == "0" - f.write(line) - end - end - end - - # クライアントにデータを送信する - def send(_data) - # server_send.txtの内容をクライアントにデータを送信する - File.open("server_send.txt", "r") do |f| - while line = f.gets - @client.puts(line) - end - end - - end - - def close - # クライアントから0を受け取ったら、クライアントとの接続を切断する - @client.close - end -end - -# サーバーの起動 -server = TcpServer.new - -server.run \ No newline at end of file +# frozen_string_literal: true + +require 'socket' + +# tcpサーバークラス +class TcpServer + # 初期化 + def initialize + @server = TCPServer.open(8001) + @client = nil + end + + def run + accept + recv + send('server_send.txt') + close + end + + private + + def accept + puts 'waiting for connection...' + # クライアントからの接続を待つ + @client = @server.accept + end + + # クライアントからのデータを受信する + def recv + puts 'connected' + # 受け取った内容をsever_recv.txtに書き込む + File.open('server_recv.txt', 'w') do |f| + while (line = @client.gets) + break if line.chomp == '0' + + f.write(line) + end + end + end + + # クライアントにデータを送信する + def send(_data) + # server_send.txtの内容をクライアントにデータを送信する + File.open('server_send.txt', 'r') do |f| + while (line = f.gets) + @client.puts(line) + end + end + end + + def close + puts 'connection closed' + # クライアントから0を受け取ったら、クライアントとの接続を切断する + @client.close + end +end + +server = TcpServer.new +server.run diff --git a/client_recv.txt b/client_recv.txt deleted file mode 100644 index 31621f0..0000000 --- a/client_recv.txt +++ /dev/null @@ -1 +0,0 @@ -"Taro,nice to meet you!" diff --git a/client_send.txt b/client_send.txt deleted file mode 100644 index 3761e14..0000000 --- a/client_send.txt +++ /dev/null @@ -1 +0,0 @@ -"My name is Taro" \ No newline at end of file diff --git a/server_recv.txt b/server_recv.txt deleted file mode 100644 index f42ab17..0000000 --- a/server_recv.txt +++ /dev/null @@ -1 +0,0 @@ -"My name is Taro" diff --git a/server_send.txt b/server_send.txt deleted file mode 100644 index fa49d4b..0000000 --- a/server_send.txt +++ /dev/null @@ -1 +0,0 @@ -"Taro,nice to meet you!" \ No newline at end of file