2012-03-29 12 views
9

Para un pequeño proyecto educativo destinado a ser un recurso de la comunidad para ayudar a las personas a aprender Scala, estoy buscando una manera simple de servir y procesar páginas web en un hilo de fondo.Scala: ¿cómo insertar un pequeño servidor web en una aplicación scala?

Fondo mínimo: Scalatron es un juego multi-jugador en el que los programas bot jugadores de pozo (escrito en Scala) uno contra el otro. Va acompañado de un tutorial paso a paso de Scala. Actualmente los jugadores necesitan usar un IDE en sus máquinas locales para compilar bots, que luego se publican en el juego copiándolos en un directorio de red compartido. Esto es engorroso. Para la próxima versión, sería agradable ofrecer edición y publicación de bots basados ​​en navegador para simplificar al máximo la configuración tanto para organizadores como para jugadores.

ya tengo un trabajo subproceso de fondo que compilar el código fuente Scala de llegar en el servidor sobre la marcha (obviando la necesidad de una plena IDE). A continuación, tengo que ejecutar un pequeño servidor web para proporcionar un punto de acceso para los jugadores y gestionar las cargas de bots (esto elimina el recurso compartido de red).

Los requisitos son muy básicos: inicialmente preveo servir una sola página con un cuadro de edición y un botón "Ir" (= cargar al servidor, compilar & publicar en el juego); Espero no más de 20 usuarios simultáneos con no más de una carga de bot en todos los usuarios cada 5 o 10 segundos; Necesito mantener un estado mínimo para cada usuario (solo un nombre) y debo devolver los mensajes de error del compilador al usuario. Tenga en cuenta que las actualizaciones de la pantalla del juego NO se mostrarán en el navegador, sino en un proyector conectado a la máquina del servidor. Y principalmente para permitir la configuración más simple posible (haga doble clic en el servidor del juego .jar), creo que sería bueno ejecutar el servidor web en un hilo de fondo dentro del servidor del juego existente.

¿Cuál es la forma más adecuada de hacerlo? ¿Debería usar algún framework existente, como Play o Lift? ¿Existe un código para hacer algo muy similar a esto? ¿Es razonable planear ejecutar un servidor web en un hilo de fondo como este? Cualquier consejo es apreciado.

Respuesta

2

Uno de los servidores web, integrables/contenedores de servlets pequeños más utilizados en el mundo Java es Jetty. Como Scala puede usar fácilmente las bibliotecas de Java, debería ser fácil de usar desde Scala.

This page muestra algunos ejemplos simples (en Java) sobre cómo iniciarlo como un servidor HTTP.

+0

Grande, será comprobar que fuera, gracias! –

+0

Tengo todo funcionando con Jetty. Gracias por el consejo. –

0

Como desea proporcionar un marco, creo que la mejor solución es utilizar un marco existente, de esa manera usted no tendrá que preocuparse de volver a inventar cosas.

Desde mi experiencia personal, que es muy subjetiva, sugeriría que usted utilice Ascensor como sé que es muy poderosa para el apoyo de las sesiones, fragmentos globales y otras cosas. Puede tratar de ampliar el clásico chat app que se utiliza como ejemplo de cómo funciona la elevación, la prueba si es útil para su uso o no debe ser larga.

+0

OK, gracias, iré a ver eso. –

3

Embedding Jetty es bastante fácil, siendo uno de los principales objetivos del proyecto Jetty. Si lo que necesita es simple, esta es la ruta más rápida. Sospecho que rápidamente necesitará una solución más robusta (modelos, rutas, plantillas, etc.) por lo que usar una estructura como Lift o Play Framework sería una mejor idea.

10

Servidores web integrados es exactamente lo que Unfiltered se hizo para. La filosofía básica de Unfiltered es que el servidor web es solo una biblioteca a la que llama desde su código, en lugar de que su código sea algo que llama el marco web.

+0

Gracias, eso suena genial. Voy a mirarlo. –

+0

Eso es perfecto, ojalá pudiera dar un voto adicional. Tengo que ** inventar ** un proyecto que lo usa para aprender Scala. – aitchnyu

+0

Para el caso de uso muy pequeño, me pareció más complejo de lo que se justifica evitar un 'si' ligeramente anidado, especialmente porque de todos modos necesitaría Jetty o algo así. Consiguió Jetty integrado y trabajando en aproximadamente una hora. Tal vez Unfiltered dará sus frutos cuando las cosas se involucren más. –

1

Aquí hay un par de diferentes ejemplos de la incorporación de los contenedores de Java y los marcos Scala:

Si bien ambos charla sobre la ejecución de la aplicación en Heroku, puede simplemente ejecútelos como aplicaciones Scala independientes.

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 } 
    } 
    } 
} 

Véase también scala kittens

Cuestiones relacionadas