Working with TCP Sockets 読書メモ 第16章 シリアル

Working with TCP Sockets 読書メモ 目次

シリアル

  • 初めに取り上げるのは、リクエスト処理の「シリアル」モデル

解説

  • 「シリアル」アーキテクチャではクライアントの接続は連続的に処理される
  • このアーキテクチャの流れは以下のようになる
  1. クライアントが接続する
  2. クライアントとサーバはリクエストとレスポンスを相互にやり取りする
  3. クライアントは接続を切る
  4. 1に戻る

実装

require 'socket'
require_relative 'command_handler'

module FTP
  CRLF = "\r\n"

  class Serial
    def initialize(port = 21)
      @control_socket = TCPServer.new(port)
      trap(:INT) { exit }
    end

    def gets
      @client.gets(CRLF)
    end

    def respond(message)
      @client.write(message)
      @client.write(CRLF)
    end

    def run
      loop do
        @client = @control_socket.accept
        respond "220 OHAI"

        handler = CommandHandler.new(self)

        loop do
          request = gets
          if request
            respond handler.handle(request)
          else
            @client.close
            break
          end
        end
      end
    end
  end
end

server = FTP::Serial.new(4481)
server.run
  • 接続ごとにCommandHandlerが処理を行う

考慮事項

  • メリット:シンプルさ
  • デメリット:並列性がない

コメントを残す

コメントを残す