В направляющих, что было бы лучшим способом интегрировать процесс слушания UDP, который обновил определенные элементы модели (конкретно ее попытка добавить строки к одной из таблиц).
Простой ответ, кажется, запускают поток с объекта сокета UDP в рамках того же процесса, но не ясный вполне, где я должен даже сделать это, которое оснащает направляющими путь. Существует ли аккуратный способ начать слушать UDP? Конкретно я хотел бы смочь записать UDPController и обратиться к конкретному методу каждое Датаграммное сообщение. Идеально я хотел бы избегать использования HTTP по UDP (поскольку он потратит впустую часть из того, что в этом случае является очень драгоценным пространством), но я полностью контролирую формат сообщения, таким образом, я могу предоставить направляющим любую информацию, в которой он нуждался бы.
Рейлс - это фреймворк веб-приложений, а не фреймворк серверного демона. Если вы не знаете о веб-сервере, который передает UDP-пакеты, я полагаю, что вам придется написать и запустить отдельный процесс и либо заставить его взаимодействовать с вашим Rails-приложением по HTTP, либо просто манипулировать базой данных напрямую.
Позвольте мне сделать подачу для TCP. UDP - это протокол "бросай пакет на ветер", который не обеспечивает никакой надежности. Он находит применение, например, в передаче голоса по IP, где нечетный брошенный пакет приемлем. Используя TCP-сокет, Вы все еще можете избежать использования HTTP, плюс TCP-стек будет обрабатывать повторные попытки и т.д.
TCP-сервер, который запускается inetd - самая простая вещь в мире: Вы пишете программу, которая читает из stdin и пишет в stdout, а затем говорите inetd, чтобы он запускал эту программу всякий раз, когда приходят запросы на определенном порту. Вам не придётся писать никакого сетевого кода.
Вот простой tcp-сервер inetd:
#!/usr/bin/ruby1.8
input = gets
puts "You said: #{input}"
Вот как сказать inetd, чтобы он его запустил:
1024 stream tcp nowait wconrad /tmp/tcpserver.rb
Это значит прослушивать tcp-соединения на порту 1024. Когда они произойдут, запустите /tmp/tcpserver.rb от имени пользователя wconrad. 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
и просто показать, что tcp-серверы в Ruby просты:
!/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.
.