如何在rails应用程序中实现tcp套接字?

时间:2016-08-01 15:55:37

标签: ruby-on-rails ruby sockets tcp

我是一般的铁轨和网络开发的初学者。我希望在rails应用程序中实现ruby TCPSocket服务器,该应用程序将通过原始tcp连接从没有http协议的客户端接收数据。该应用程序将具有其他功能,将由rails处理。这可能吗? 例如,这是一个可以在我的计算机上运行的简单服务器:

require 'socket'               

server = TCPServer.new 3490  
puts "waiting for connection"
client = server.accept  
puts "client found"                         
while str=client.recv(100);      
    val=str.unpack("H*")
    temp=val.join('').gsub('0','').to_i

#application specific code below
    if temp<100
        temp=temp*10
    end
    print "Temperature: "
    puts temp*0.125
 end

如何在rails应用中实现此功能? 任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

Rails基本上是Rack应用程序,根据Rails documentation

  

Rails.application 是Rails的主要Rack应用程序对象   应用。任何符合Rack的Web服务器都应该使用    Rails.application 对象,用于提供Rails应用程序。

由于Rack主要包装HTTP请求和响应,因此可能无法与Rails服务器构建基于纯TCP IP套接字的交互。

但是,您可能希望查看Action Cable,这是Rails 5的新增功能 - 它将websockets与Rails应用程序集成在一起。根据{{​​3}},

  

WebSocket协议是一种独立的基于TCP的协议。这只是   与HTTP的关系是它的握手由HTTP解释   服务器作为升级请求。

如果Rails主要是一个Web应用程序框架,如何提取Action Cable以使用非浏览器客户端可能会很棘手。

答案 1 :(得分:0)

您可能需要在/ lib下创建模块,并在需要使用此功能的特定rails控制器中要求它

TCPServer可以是实现它的有效选项,您只需要它。

答案 2 :(得分:0)

您可以在rails应用程序中创建TCP套接字,并同时处理多个请求,以实现线程化。 要进行通信,请使用文本格式或JSON。

链接:https://ruby-doc.org/stdlib-2.4.0/libdoc/socket/rdoc/TCPServer.html

首先通过以下命令在lib目录中创建一个任务:

rails g task socketing start

这将在app / lib / tasks /中创建一个名为socketing.rake的文件,并在其中创建一个任务“开始”。 现在,将文件编辑为:

  task start: :environment do
    require 'socket'
    puts "Started TCP Server"
    server = TCPServer.new 53492 # Server bound to port 53492
    loop do
      Thread.start(server.accept) do |client|
        p "Inside Task"
        string = client.recv(1000).chomp ## Request Data received at the socket port
        result = JSON.parse(string)
        p 'Bye'
        client.puts result.to_s
        client.close
      end
    end
  end

从终端在项目文件夹中的套接字运行方式为:

rails socketing:start

或与nohup一起作为恶魔运行

现在,应用程序将开始侦听TCP中的53492端口,并开始发送对请求的响应。

JSON格式的采样请求:

echo'{“ password”:“ 12345678”,“ name”:“ vidur.punj@xyz.com”}'| nc本地主机53492

或使用模块创建套接字,并在控制器操作中要求它,在这种情况下,请在app / lib / socketing.rb

中创建一个新模块

具有以下代码:

require 'socket'
puts "Started TCP Server"
server = TCPServer.new 53492 # Server bound to port 53492
loop do
  Thread.start(server.accept) do |client|
    p "Inside Task"
    string = client.recv(1000).chomp ## Request Data received at the socket port
    result = JSON.parse(string)
    p 'Bye'
    client.puts result.to_s
    client.close
  end
end

并定义到该控制器的路由:

  get '/socket', to: 'webhook#socket', as: 'socket'

从浏览器中对该路由进行调用,将启动TCP服务器并开始发送对请求的响应,您还可以检查日志。 enter image description here enter image description here