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
Post a Comment