Scala: как встроить небольшой веб-сервер в приложение Scala? - PullRequest
9 голосов
/ 30 марта 2012

Для небольшого образовательного проекта, предназначенного в качестве ресурса сообщества, чтобы помочь людям изучать Scala, я ищу простой способ обслуживания и обработки веб-страниц в фоновом режиме.

Минимальный фон: Scalatron - это многопользовательская игра, в которой игроки соревнуются друг с другом в программах ботов (написанных на Scala). Он сопровождается пошаговым руководством по Scala. В настоящее время игрокам необходимо использовать IDE на своих локальных компьютерах для компиляции ботов, которые затем публикуются в игре путем копирования их в общую сетевую директорию. Это громоздко Для следующей версии было бы неплохо предложить редактирование и публикацию ботов на основе браузера, чтобы максимально упростить настройку как для организаторов, так и для игроков.

У меня уже работает фоновый поток, который будет компилировать исходный код Scala, поступающий на сервер на лету (устраняя необходимость в полной IDE). Затем мне нужно запустить крошечный веб-сервер, чтобы обеспечить точку доступа для игроков и обрабатывать загрузки ботов (это избавляет от общего сетевого ресурса).

Требования очень просты: изначально я предусматривал обслуживание одной страницы с полем для редактирования и кнопкой «Перейти» (= загрузка на сервер, компиляция и публикация в игре); Я ожидаю, что не более 20 одновременно работающих пользователей с загрузкой не более одного бота всем пользователям каждые 5 или 10 секунд; Мне нужно держать минимальное состояние для каждого пользователя (только имя), и мне нужно возвращать сообщения об ошибках компилятора пользователю. Обратите внимание, что обновления игрового экрана будут отображаться НЕ в браузере, а на проекторе, подключенном к серверу. И в первую очередь, чтобы обеспечить максимально простую настройку (двойной щелчок по игровому серверу .jar). Я думаю, было бы неплохо запустить веб-сервер в фоновом режиме на существующем игровом сервере.

Какой самый подходящий способ сделать это? Должен ли я использовать некоторые существующие рамки, такие как Play или Lift? Существует ли существующий код для выполнения чего-то очень похожего на это? Есть ли смысл планировать запуск веб-сервера в фоновом режиме, как этот? Любой совет приветствуется.

Ответы [ 6 ]

11 голосов
/ 30 марта 2012

Встроенные веб-серверы - это именно то, для чего был создан Нефильтрованный .Основная философия Unfiltered заключается в том, что веб-сервер - это просто библиотека, которую вы вызываете из своего кода, а не код, который вызывает веб-инфраструктура.

3 голосов
/ 30 марта 2012

Встраивание Jetty довольно просто, являясь одной из основных целей проекта Jetty. Если вам нужно просто, это самый быстрый маршрут. Я подозреваю, что вам быстро понадобится более надежное решение (модели, маршрутизация, шаблоны и т. Д.), Поэтому лучше использовать такую ​​инфраструктуру, как Lift или Play Framework .

2 голосов
/ 30 марта 2012

Один из наиболее часто используемых небольших встраиваемых веб-серверов / контейнеров сервлетов в мире Java - Jetty .Поскольку Scala может легко использовать библиотеки Java, это должно быть легко с Scala.

На этой странице показаны некоторые простые примеры (на Java) о том, как запустить его как встроенный HTTP-сервер..

1 голос
/ 13 июня 2012
val webServer = new Thread("Web Server") {
  def response(text: String, code: String = "200 OK") =
    """HTTP/1.0 """ + code + """
  Content-Type: text/html
  Content-Length: """ + text.length + """

  """ + text

  override def run {
    for(port <- env.webPort) {
      val ss = new ServerSocket(port)
      while (true) try {
        val s = ss.accept
        try { s.getOutputStream.write(response(someStuff.toString).getBytes)
        } finally { s.close }
      } catch { case ie: InterruptedException => return }
    }
  }
}

См. Также котята scala

1 голос
/ 30 марта 2012

Вот несколько примеров встраивания контейнеров Java и фреймворков Scala:

Хотя оба из них говорят о запуске приложения в Heroku, вы можете просто запустить их как автономные приложения Scala.

0 голосов
/ 30 марта 2012

Поскольку вы хотите предоставить платформу, я думаю, что лучшее решение - это использовать существующую платформу, чтобы вам не пришлось возиться с переизобретением вещей.

Исходя из моего личного опыта, который действительно субъективен, я бы предложил вам использовать Lift, поскольку я знаю, что он очень мощный для поддержки сессий, глобальных фрагментов и других вещей.Вы можете попробовать расширить классическое приложение для чата , которое используется в качестве примера того, как работает лифт, тестируя, полезно ли оно для вашего использования или не должно быть долгим.

...