2016-08-19 83 views
0

我需要製作一個緩存服務器,其實就像memcached,所以我試圖啓動一個Telnet服務器,以便我可以發送命令,然後告訴我是否需要存儲數據或從鍵。我想這樣做,因爲我需要實現一個TCP服務器,我需要使用命令,所以一個普通的HTTP服務器是不夠的(雖然我可以發佈的數據和地址可以是命令,我仍然搞清楚)。Ruby Telnet拒絕連接

現在的背景後,真正的問題是,我甚至不能啓動我的Telnet服務器,這是我在網上找到的代碼:

localhost = Net::Telnet::new("Host" => "localhost", 
         "Timeout" => 10, 
         "Prompt" => /[$%#>] \z/n) 
localhost.login("username", "password") { |c| print c } 
localhost.cmd("command") { |c| print c } 
localhost.close 

我真的不明白這在很大程度上,也許我試圖用該代碼連接到現有的Telnet服務器,這就是爲什麼它不起作用。無論如何,我得到它的錯誤就是:

C:/Ruby22-x64/lib/ruby/2.2.0/net/telnet.rb:350:in `initialize': No connection could be made because the target machine actively refused it. - connect(2) for "localhost" port 23 (Errno::ECONNREFUSED) 
from C:/Ruby22-x64/lib/ruby/2.2.0/net/telnet.rb:350:in `open' 
from C:/Ruby22-x64/lib/ruby/2.2.0/net/telnet.rb:350:in `block in initialize' 
from C:/Ruby22-x64/lib/ruby/2.2.0/timeout.rb:88:in `block in timeout' 
from C:/Ruby22-x64/lib/ruby/2.2.0/timeout.rb:98:in `call' 
from C:/Ruby22-x64/lib/ruby/2.2.0/timeout.rb:98:in `timeout' 
from C:/Ruby22-x64/lib/ruby/2.2.0/net/telnet.rb:349:in `initialize' 
from C:/Users/Bruno/RubymineProjects/Ruby Server/Server.rb:37:in `new' 
from C:/Users/Bruno/RubymineProjects/Ruby Server/Server.rb:37:in `<top (required)>' 
from -e:1:in `load' 
from -e:1:in `<main>' 

Process finished with exit code 1 

預先感謝您的任何幫助或提示,正如我所說,我仍然試圖找出如何做到這一點。

+2

這是一個客戶端。你的服務器在哪裏?你很難看到其中一種在野外運作。 – tadman

+0

我以爲我正在啓動一臺服務器。我在做這個之前試過:'@server = TCPServer.new(host,port)'帶有「127.0.0.1」8899,而通常的循環是socket = @ server.accept ...等等。但是,當我嘗試通過執行telnet主機端口的cmd連接到它時,但它失敗並出現相同的錯誤。我想我從來沒有真正開始一個Telnet服務器,我該如何使用紅寶石啓動一個? –

+1

你可能沒有在你的客戶端指定端口,它的默認值爲23.值得注意的是,telnet是一件博物館作品,你可能想用常規的TCPSocket代替。 – tadman

回答

1

你可能想要的是這樣的:

localhost = Net::Telnet::new(
    "Host" => "localhost", 
    "Port" => 8899, 
    "Timeout" => 10, 
    "Prompt" => /[$%#>] \z/n 
) 

將連接到端口8899在本地機器上。如上所述,telnet協議幾乎都是死的,在2016年真的沒有用。

另一方面,telnet客戶端非常適合用純文本協議連接到TCP服務。這包括HTTP,正如你所看到的,Memcache。

我建議你使用更通用TCPServer爲你的代碼的基礎:

server = TCPServer.new(8899) 

然後你就可以從那裏使用線程建立你的服務,或者在必要時纖維。

儘管telnet可能已經死亡,但TCP/IP仍然運行良好。簡單的純文本協議與以往一樣受歡迎,這就是爲什麼很容易將telnet協議與telnet工具混淆的原因。

+0

謝謝@tadman'server = TCPServer.new(8899)'完美地工作,我現在可以連接我的cmd。我將開始嘗試實施存儲和讀取數據的命令。再次感謝你 –