websocket - ruby eventmachine : issue when doing EM.watch on a Net::telnet instance -


i trying write web telnet client using html5 websocket ruby eventmachine. failed when em.watch tried watch new created instance of net::telnet. following server side , client side code:

server side:

require 'em-websocket' require "debugger" require 'net/telnet'   class foo < em::connection   def initialize(websocket)     @websocket = websocket     @alltext = ""   end     def notify_readable         header= @io.recvfrom(2000)[0].chomp         header2 = header.to_s.encode("utf-8", :invalid => :replace, :undef => :replace, :replace => "s")         if header2.length ==1               @alltext = @alltext + header2         else              @alltext.each_line |x|                   $stdout.puts x                  @websocket.send x             end             @alltext = ""            header2.to_s.each_line |y|                 $stdout.puts y                 @websocket.send  y             end         end          if header == "\r\n"            fd = detach         end         rescue eoferror               detach   end  def unbind     em.next_tick      end     puts "close socket:" + @io.to_s end end   eventmachine::websocket.start(:host => "0.0.0.0", :port => 8090) |ws|       ws.onopen    {                  puts "web socket opened"                 ws.send "terminal node"                           nodesocket = net::telnet::new("host" => "10.4.0.50","timeout" => 10,"prompt" => /login/ )                           puts nodesocket                 nodesocket.cmd("username") { |c| print c}                 nodesocket.cmd("password") { |c| print c}                             em.run{                           $conn = em.watch nodesocket,foo,ws                            $conn.notify_readable = true                  }        }        ws.onmessage { |msg|                  puts msg                 ws.send msg       }         ws.onclose   {              puts "websocket closed"        } end 

clint side:

require 'eventmachine' require 'em-http-request'  eventmachine.run {   http = eventmachine::httprequest.new("ws://localhost:8090").get :timeout => 0   http.errback { puts "oops" }   http.callback {   puts "websocket connected!"   http.send("hello client")  }  http.stream { |msg|    puts "recieved: #{msg}"   } } 

server side log

c:\ruby193\bin>ruby websocketserver12.rb web socket opened #<net::telnet:0xf976e0> ------------------welcome syseng1-------------------- machine server -------------------------------------------------------- ubuntu 8.04.3 lts syseng1 login: username password: last login: tue jun  5 15:05:00 edt 2012 358.ystems.com on pts/0 linux syseng1 2.6.24-24-generic #1 smp fri jul 24 22:46:06 utc 2009 i686  programs included ubuntu system free software; exact distribution terms each program described in individual files in /usr/share/doc/*/copyright.  ubuntu comes absolutely no warranty, extent permitted applicable law.  access official ubuntu documentation, please visit: http://help.ubuntu.com/ have mail. ←[01;32musername@syseng1 ←[01;34m~ $ ←[00mwebsocket closed c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-    mingw32/lib/eventmachine.rb:735:in `attach_fd': can't convert net::telnet integer (typeerror)     c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-mingw32/lib/eventmachine.rb:735:in `attach_io'     c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-mingw32/lib/eventmachine.rb:708:in `watch'     websocketserver12.rb:57:in `block (3 levels) in <main>'     c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-mingw32/lib/eventmachine.rb:163:in `call'     c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-mingw32/lib/eventmachine.rb:163:in `run'     websocketserver12.rb:56:in `block (2 levels) in <main>'     c:/ruby193/lib/ruby/gems/1.9.1/gems/em-websocket-0.3.6/lib/em-websocket/connection.rb:20:in `call'     c:/ruby193/lib/ruby/gems/1.9.1/gems/em-websocket-0.3.6/lib/em-websocket/connection.rb:20:in `trigger_on_open'     c:/ruby193/lib/ruby/gems/1.9.1/gems/em-websocket-0.3.6/lib/em-websocket/handler.rb:18:in `run'     c:/ruby193/lib/ruby/gems/1.9.1/gems/em-websocket-0.3.6/lib/em-websocket/connection.rb:114:in `dispatch'     c:/ruby193/lib/ruby/gems/1.9.1/gems/em-websocket-0.3.6/lib/em-websocket/connection.rb:71:in `receive_data'     c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-mingw32/lib/eventmachine.rb:179:in `run_machine'     c:/ruby193/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0.beta.4.1-x86-mingw32/lib/eventmachine.rb:179:in `run'     c:/ruby193/lib/ruby/gems/1.9.1/gems/em-websocket-0.3.6/lib/em-websocket/websocket.rb:9:in `start'     websocketserver12.rb:47:in `<main>' 

it looked em.watch can't watch net::telnet::new instance because couldn't convert file handle integer somewhere in lib. tried same thing em.watch watch tcpsocket, eventmachine worked well. have same issue before?

the error in `attach_fd': can't convert net::telnet integer (typeerror) being raised because eventmachine.watch() "registers given file descriptor or io object eventloop" , net::telnet instance neither of these.

according net::telnet documentation, sock attribute of net::telnet instance refers socket used instance. pass eventmachine.watch() method.


Comments

Popular posts from this blog

jquery - Invalid Assignment Left-Hand Side -

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -