【问题标题】:How to implement a tcp socket in a rails app?如何在 Rails 应用程序中实现 tcp 套接字?
【发布时间】:2020-10-30 14:12:06
【问题描述】:

总的来说,我是 Rails 和 Web 开发的初学者。我希望在 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 应用中实现这一点? 任何形式的建议将不胜感激。

【问题讨论】:

标签: ruby-on-rails ruby sockets tcp


【解决方案1】:

Rails 基本上是Rack 应用程序,按照Rails documentation

Rails.application 是 Rails 的主要 Rack 应用程序对象 应用。任何 Rack 兼容的 Web 服务器都应该使用 Rails.application 对象为 Rails 应用程序提供服务。

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

不过,您可能想看看Action Cable,它是Rails 5 的一个新成员——它将websockets 与Rails 应用程序集成在一起。根据Wikipedia

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

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

【讨论】:

    【解决方案2】:

    您可以在 rails 应用程序中制作 TCP Sockets 并同时处理多个请求实现线程。 使用文本格式或 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 的文件,并在其中创建一个任务“start”。 现在将文件编辑为:

      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 格式的示例请求:

    回显'{“密码”:“12345678”,“名称”:“vidur.punj@xyz.com”}' |数控本地主机 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 服务器将启动并开始发送对请求的响应,您还可以检查日志。

    【讨论】:

      【解决方案3】:

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

      TCPServer 可以是一个有效的选项来实现它,你只需要它。

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 2012-05-04
        • 2013-11-08
        • 2014-05-27
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        相关资源
        最近更新 更多