Направляющие поддерживают аккуратный способ слушать сокет UDP?

В направляющих, что было бы лучшим способом интегрировать процесс слушания UDP, который обновил определенные элементы модели (конкретно ее попытка добавить строки к одной из таблиц).

Простой ответ, кажется, запускают поток с объекта сокета UDP в рамках того же процесса, но не ясный вполне, где я должен даже сделать это, которое оснащает направляющими путь. Существует ли аккуратный способ начать слушать UDP? Конкретно я хотел бы смочь записать UDPController и обратиться к конкретному методу каждое Датаграммное сообщение. Идеально я хотел бы избегать использования HTTP по UDP (поскольку он потратит впустую часть из того, что в этом случае является очень драгоценным пространством), но я полностью контролирую формат сообщения, таким образом, я могу предоставить направляющим любую информацию, в которой он нуждался бы.

6
задан sth 28 December 2009 в 02:24
поделиться

2 ответа

Рейлс - это фреймворк веб-приложений, а не фреймворк серверного демона. Если вы не знаете о веб-сервере, который передает UDP-пакеты, я полагаю, что вам придется написать и запустить отдельный процесс и либо заставить его взаимодействовать с вашим Rails-приложением по HTTP, либо просто манипулировать базой данных напрямую.

1
ответ дан 17 December 2019 в 20:32
поделиться

Позвольте мне сделать подачу для 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.

.
1
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: