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