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 #socketsocket.remote_addresssocket.remote_address.ip_address #socketsocket.remote_addresssocket.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 "#ee.message #socketsocket.remote_addresssocket.remote_address.ip_address #socketsocket.remote_addresssocket.remote_address.ip_port" rescue EOFError => e STDERR.puts "#ee.message #socketsocket.remote_addresssocket.remote_address.ip_address #socketsocket.remote_addresssocket.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

#accept ⇒ Object



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

#close ⇒ Object



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

def close
  @tcp_server.close
  @tcp_server = nil
end