0

我必须在 sinatra 中转储一项服务并将其显示在网页的内容区域中。

我必须通过代码访问的服务在端口 6557 的服务器上运行。它不使用任何加密或身份验证。它是一个普通的只读请求响应,类似于 http。这是在终端中有效的方法

$ echo "GET hosts" | nc 192.168.1.1 6557

给了我预期的输出。我需要使用 sinatra 应用程序做类似的事情。

我写了这段代码,但完全不正确。有人可以帮助我提供代码或查找材料或示例。

get '/' do
        host = "192.168.1.1"
        port = 6557
        dat = ""
        @socket = TCPSocket.open (host, port)
                while(true)
                        if(IO.select([],[],[@socket],0))
                                socket.close
                                return
                        end
                        begin
                                while( (data = @socket.recv_nonblock(100)) != "")
                                        dat = dat+ data
                                end
                                rescue Errno::EAGAIN
                        end
                        begin
                                @str = "GET hosts"
                                @socket.puts(@str);
                        rescue Errno::EAGAIN
                        rescue EOFError
                                exit
                        end
                        IO.select([@socket], [@socket], [@socket])
                end
        @line = dat
        erb :info
end

执行代码就挂了。另外,如果可能的话,请提供一些链接以阅读以获得问题的概念背景。

4

2 回答 2

0

您可以使用反引号或命令直接从 ruby​​ 执行 shell 命令system。这样的事情可能对你有用:

get "/" do
  @line = `echo "GET hosts" | nc 192.168.1.1 6557`
  erb :info
end

查看Kernel#system 的 ruby​​ 文档以获取更多信息。

于 2012-10-08T11:09:57.433 回答
0

我认为与您的 shell 命令等效的 Ruby 应该很简单:

require "socket"

socket = TCPSocket.new "192.168.1.1", 6557
socket.puts "GET hosts"
socket.read

根据文档,#read 应该自动关闭套接字,因此您无需担心手动执行此操作。

于 2012-10-18T12:39:44.783 回答