Class: Wands::WebSocketServer

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Protocol::WebSocket::Headers
Defined in:
lib/wands/web_socket_server.rb

Overview

The WebSocketServer class is responsible for accepting WebSocket connections. This class has the same interface as TCPServer.

Example usage:

server = WebSocketServer.new(‘localhost’, 2345) loop do

begin
 socket = server.accept
 next unless socket
 puts "Accepted connection from #{socket.remote_address.ip_address} #{socket.remote_address.ip_port}"

 received_message = socket.gets
 puts "Received: #{received_message}"

 socket.write received_message
 socket.close
rescue WEBrick::HTTPStatus::EOFError => e
 STDERR.puts e.message
rescue Errno::ECONNRESET => e
 STDERR.puts "#{e.message} #{socket.remote_address.ip_address} #{socket.remote_address.ip_port}"
rescue EOFError => e
 STDERR.puts "#{e.message} #{socket.remote_address.ip_address} #{socket.remote_address.ip_port}"
end

end

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hostname, port) ⇒ WebSocketServer

Returns a new instance of WebSocketServer.



45
46
47
# File 'lib/wands/web_socket_server.rb', line 45

def initialize(hostname, port)
  @tcp_server = TCPServer.new hostname, port
end

Class Method Details

.open(hostname, port) ⇒ Object



41
42
43
# File 'lib/wands/web_socket_server.rb', line 41

def self.open(hostname, port)
  new(hostname, port)
end

Instance Method Details

#acceptObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/wands/web_socket_server.rb', line 49

def accept
  socket = @tcp_server.accept

  request = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
  headers = read_headers_from request, socket
  unless headers["upgrade"].include? PROTOCOL
    socket.close
    raise "Not a websocket request"
  end

  response = response_to headers
  response.send_response socket

  WebSocket.new socket
rescue WEBrick::HTTPStatus::BadRequest => e
  warn "WEBRick error message: #{e.full_message}"
  warn "HTTP request string: #{request}" if request
  if socket
    socket.write "HTTP/1.1 400 Bad Request\r\n\r\n"
    socket.close
  end
end

#closeObject



72
73
74
75
# File 'lib/wands/web_socket_server.rb', line 72

def close
  @tcp_server.close
  @tcp_server = nil
end