我是一般的铁轨和网络开发的初学者。我希望在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应用中实现此功能? 任何建议都将不胜感激。
答案 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'