| #!/usr/bin/env ruby |
| |
| # A WebSocket server that echos back whatever it receives from the client. |
| # Copyright 2011 Joel Martin |
| # Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) |
| |
| require 'socket' |
| $: << "other" |
| $: << "../other" |
| require 'websocket' |
| |
| class WebSocketEcho < WebSocketServer |
| |
| # Echo back whatever is received |
| def new_websocket_client(client) |
| |
| cqueue = [] |
| c_pend = 0 |
| rlist = [client] |
| |
| loop do |
| wlist = [] |
| |
| if cqueue.length > 0 or c_pend |
| wlist << client |
| end |
| |
| ins, outs, excepts = IO.select(rlist, wlist, nil, 1) |
| if excepts.length > 0 |
| raise Exception, "Socket exception" |
| end |
| |
| if outs.include?(client) |
| # Send queued data to the client |
| c_pend = send_frames(cqueue) |
| cqueue = [] |
| end |
| |
| if ins.include?(client) |
| # Receive client data, decode it, and send it back |
| frames, closed = recv_frames |
| cqueue += frames |
| |
| if closed |
| raise EClose, closed |
| end |
| end |
| |
| end # loop |
| end |
| end |
| |
| port = ARGV[0].to_i || 8080 |
| puts "Starting server on port #{port}" |
| server_cert = nil |
| server_key = nil |
| if ARGV.length > 2 |
| server_cert = ARGV[1] |
| server_key = ARGV[2] |
| end |
| |
| server = WebSocketEcho.new('listen_port' => port, 'verbose' => true, |
| 'server_cert' => server_cert, 'server_key' => server_key) |
| server.start |
| server.join |
| |
| puts "Server has been terminated" |
| |
| # vim: sw=2 |