Rails是否支持一种简洁的方式来监听UDP套接字?

时间:2009-12-28 00:59:22

标签: ruby-on-rails ruby sockets udp

在Rails中,集成UDP监听过程的最佳方法是更新模型的某些元素(特别是它将向其中一个表添加行)。

简单的答案似乎是在同一个进程中用UDP套接字对象启动一个线程,但是我还不清楚我应该在哪里做适合rails方式的那个。有没有一种简洁的方式来开始收听UDP?具体来说,我希望能够编写UDPController并在每个Datagram消息上调用特定方法。理想情况下,我希望避免使用HTTP over UDP(因为它会浪费一些在这种情况下非常宝贵的空间),但我完全控制了消息格式,因此我可以为Rails提供所需的任何信息。

2 个答案:

答案 0 :(得分:1)

Rails是一个Web应用程序框架,而不是服务器守护程序框架。除非您知道传递UDP数据包的Web服务器,否则我认为您必须编写并运行单独的进程,并通过HTTP与Rails应用程序通信或直接操作数据库。

答案 1 :(得分:0)

让我为TCP做一个推销。 UDP是“将数据包扔到风中”协议,它不提供可靠性。它可用于例如IP语音,其中奇数丢弃的分组是可接受的。通过使用TCP套接字,您仍然可以避免使用HTTP,而TCP堆栈将处理重试和&等等。

由inetd启动的TCP服务器是世界上最简单的事情:你编写一个从stdin读取并写入stdout的程序,然后告诉inetd在某个端口上发出请求时运行该程序。您不必编写任何网络代码。

这是一个简单的inetd tcp服务器:

#!/usr/bin/ruby1.8

input = gets
puts "You said: #{input}"

以下是告诉inetd运行它的方法:

1024            stream  tcp     nowait    wconrad /tmp/tcpserver.rb

这意味着在端口1024上侦听tcp连接。当它们发生时,以用户wconrad启动/tmp/tcpserver.rb。 man inetd.conf了解更多信息。

您可以使用telnet进行测试:

$ telnet localhost 1024
Trying 127.0.0.1...
Connected to ceres.
Escape character is '^]'.
Howdy!
You said: Howdy!
Connection closed by foreign host.
$

或者您可以使用简单的客户端:

$ cat /tmp/tcpclient.rb
#!/usr/bin/ruby1.8

require 'socket'

t = TCPSocket.new('localhost', 1024)
t.puts "Hello"
t.close_write
puts t.read
t.close

$ /tmp/tcpclient.rb
You said: Hello

并且只是为了表明Ruby中的tcp服务器很简单:

!/usr/bin/ruby1.8

require 'socket'

def handle_session(socket)
  s = socket.gets
  socket.puts "You said: #{s}"
  socket.close
end

server = TCPServer.new('localhost', 1024)
while (session = server.accept)
  Thread.new do
    handle_session(session)
  end
end

由于TCP如此简单,您需要一个令人信服的理由来打扰UDP。