Scala:如何将一个小型Web服务器嵌入到scala应用程序中?

时间:2012-03-29 20:42:19

标签: scala playframework webserver lift

对于一个旨在帮助人们学习Scala的社区资源的小型教育项目,我正在寻找一种在后台线程中提供和处理网页的简单方法。

最小背景:Scalatron是一款多人游戏,其中玩家将机器人程序(用Scala编写)相互对抗。它伴随着一步一步的Scala教程。目前,玩家需要在他们的本地机器上使用IDE来编译机器人,然后通过将机器人复制到共享网络目录中将其发布到游戏中。这很麻烦。对于下一个版本,最好提供基于浏览器的机器人编辑和发布,以最大限度地简化组织者和玩家的设置。

我已经有一个后台线程工作,它将编译即时到达服务器的Scala源代码(无需完整的IDE)。接下来,我必须运行一个小型的Web服务器,为玩家提供一个接入点,并处理机器人上传(这可以摆脱网络共享)。

要求非常基本:最初我设想用一个编辑框和一个“开始”按钮服务一个页面(=上传到服务器,编译和发布到游戏中);我希望每隔5或10秒钟,所有用户上传不超过一个机器人的并发用户不超过20个;我需要为每个用户保持最小状态(只是一个名字),我需要向用户返回编译器错误消息。请注意,游戏屏幕更新不会显示在浏览器中,而是显示在连接到服务器计算机的投影仪上。主要是为了允许最简单的设置(双击游戏服务器.jar)我认为在现有游戏服务器的后台线程中运行Web服务器会很不错。

最合适的方法是什么?我应该使用一些现有的框架,比如Play或Lift吗?是否存在执行与此类似的操作的代码?计划在这样的后台线程中运行Web服务器是否合理?任何建议都表示赞赏。

6 个答案:

答案 0 :(得分:11)

嵌入式Web服务器正是Unfiltered的用途。 Unfiltered的基本理念是Web服务器只是您从代码中调用的库,而不是您的代码是Web框架所调用的内容。

答案 1 :(得分:3)

Embedding Jetty相当容易,是Jetty项目的主要目标之一。如果您需要简单,这是最快的路线。我怀疑你很快就会需要一个更强大的解决方案(模型,路由,模板等),所以使用像LiftPlay Framework这样的框架会更好。

答案 2 :(得分:2)

Java世界中最常用的小型可嵌入Web服务器/ servlet容器之一是Jetty。由于Scala可以轻松使用Java库,因此从Scala中使用它应该很容易。

This page显示了一些关于如何将其作为嵌入式HTTP服务器启动的简单示例(在Java中)。

答案 3 :(得分:1)

以下是嵌入Java容器和Scala框架的几个不同示例:

虽然这两个都谈到在Heroku上运行应用程序,但您可以将它们作为独立的Scala应用程序运行。

答案 4 :(得分:1)

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 kittens

答案 5 :(得分:0)

由于你想提供一个框架,我认为最好的解决方案是使用现有的框架,这样你就不必费心去重新发明东西了。

根据我个人的经验,这是非常主观的,我建议你使用Lift,因为我知道它对于会话,全局片段和其他内容的支持非常强大。你可以尝试扩展经典的chat app,它用作升力如何工作的一个例子,测试它对你的使用是否有用不应该很长。