Ruby: TCPSocket、Socket クラスを使って TCP、SSL クライアントをつくる

まずは TCPSocket を使う場合。

require 'socket'

msg = "GET / HTTP/1.1\r\n" \
     + "Host: localhost\r\n" \
     + "Connection: close\r\n" \
     + "\r\n"

s = TCPSocket.new 'localhost', 12345
s.puts msg

ret = ''
while line = s.gets
  ret += line
end

s.close

puts ret

Socket クラスを使う場合、次のようになる。

require 'socket'
include Socket::Constants

port = 12345
host = '0.0.0.0'

msg = "GET / HTTP/1.1\r\n" \
     + "Host: localhost\r\n" \
     + "Connection: close\r\n" \
     + "\r\n"

socket = Socket.new AF_INET, SOCK_STREAM
socket.set_encoding 'UTF-8'
sockaddr = Socket.pack_sockaddr_in port, host
socket.connect sockaddr
socket.write msg
ret = socket.read
socket.close

puts ret

次に SSL クライアントを書いてみる。TCPSocket を OpenSSL::SSL::SSLSocket で包めばよい。

require 'socket'
require 'openssl'

port = 12345
host = '0.0.0.0'

msg = "GET / HTTP/1.1\r\n" \
     + "Host: localhost\r\n" \
     + "Connection: close\r\n" \
     + "\r\n"

context = OpenSSL::SSL::SSLContext.new
socket = TCPSocket.new host, port
ssl_client = OpenSSL::SSL::SSLSocket.new socket, context
ssl_client.connect
ssl_client.puts msg
ret = ssl_client.read

puts ret