2012-03-29 19 views
9

Dla małego projektu edukacyjnego przeznaczonego jako zasób społecznościowy, aby pomóc ludziom w nauce Scala Szukam prostego sposobu obsługi i przetwarzania stron internetowych w wątku tła.Scala: jak osadzić mały serwer WWW w aplikacji scala?

Minimalne tło: Scalatron to gra dla wielu graczy, w której gracze umieszczają programy botów (napisane w Scali) przeciwko sobie. Towarzyszy mu samouczek Scala krok po kroku. Obecnie gracze muszą używać IDE na swoich komputerach lokalnych do kompilowania botów, które następnie są publikowane w grze, kopiując je do współużytkowanego katalogu sieciowego. To jest kłopotliwe. Dla następnej wersji byłoby miło zaoferować przeglądarkę botów do edycji i publikacji, aby maksymalnie uprościć konfigurację dla organizatorów i graczy.

ja już dostałem tle pracy nici, które skompilować kod źródłowy Scala przybyciu na serwerze w locie (eliminując potrzebę pełnego IDE). Następnie muszę uruchomić niewielki serwer sieciowy, aby zapewnić punkt dostępu dla graczy i obsługiwać wysyłanie botów (to pozbędzie się udziału sieciowego).

Wymagania są bardzo proste: początkowo planuję obsłużyć pojedynczą stronę z polem edycyjnym i przyciskiem "Go" (= przesłać na serwer, kompilować & publikować w grze); Spodziewam się, że nie więcej niż 20 równoczesnych użytkowników nie będzie przesyłać więcej niż jednego bota przez wszystkich użytkowników co 5 lub 10 sekund; Muszę posiadać minimalny stan dla każdego użytkownika (tylko nazwa) i muszę zwrócić użytkownikowi komunikat o błędzie kompilatora. Zwróć uwagę, że aktualizacje ekranu gier NIE byłyby wyświetlane w przeglądarce, ale na projektorze podłączonym do serwera. A przede wszystkim, aby umożliwić najprostszą możliwą konfigurację (dwukrotne kliknięcie na serwerze gry .jar) Myślę, że byłoby miło uruchomić serwer w wątku tła w obrębie istniejącego serwera gry.

Jaki jest najlepszy sposób na zrobienie tego? Czy powinienem użyć jakiejś istniejącej struktury, takiej jak Play czy Lift? Czy istnieje kod do robienia czegoś bardzo podobnego do tego? Czy jest nawet rozsądne zaplanowanie uruchomienia serwera sieciowego w takim wątku w tle? Każda rada jest doceniana.

Odpowiedz

2

Jednym z najczęściej wykorzystywanych do osadzania małych serwerów web/kontenerach serwletów w świecie Java jest Jetty. Ponieważ Scala może z łatwością korzystać z bibliotek Java, powinno być łatwe w użyciu od Scala.

This page pokazuje kilka prostych przykładów (w Javie), jak uruchomić go jako wbudowany serwer HTTP.

+0

Wielki, sprawdzi, że obecnie, dzięki! –

+0

Mam wszystko, co pracuję z Jetty. Dzięki za wskazówkę. –

0

Jak chcesz zapewnić ramy, myślę, że najlepszym rozwiązaniem jest wykorzystanie istniejących ram, w ten sposób nie będzie musiał męczyć się z ponownego wymyślania rzeczy.

Z mojego osobistego doświadczenia, które jest bardzo subiektywne, proponuję używać Podnieś jak wiem, że to jest bardzo mocny na wsparcie globalnych fragmenty sesji, i inne rzeczy. Możesz spróbować rozszerzyć klasyczne chat app, który jest używany jako przykład działania windy, testowanie czy jest użyteczne dla twojego użytku, nie powinno być długie.

+0

OK, dzięki, popatrzę na to. –

3

Embedding Jetty jest dość łatwe, będąc jednym z głównych celów dla projektu Jetty. Jeśli potrzebujesz jest prosty, jest to najszybsza trasa. Podejrzewam, że szybko będziesz potrzebował bardziej niezawodnego rozwiązania (modele, routing, szablony itp.), Więc lepszym rozwiązaniem byłoby użycie architektury takiej jak Lift lub Play Framework.

10

Wbudowane serwery internetowe to dokładnie to, do czego stworzono Unfiltered. Podstawową filozofią dla Unfiltered jest to, że serwer WWW jest po prostu biblioteką, z której dzwonisz ze swojego kodu, zamiast z tego, że twój kod jest czymś, co wywołuje framework sieciowy.

+0

Dzięki, brzmi świetnie. Spojrzę na to. –

+0

To jest idealne, chciałbym dać dodatkowy upominek. Muszę ** uzupełnić ** projekt wykorzystujący go do nauki Scali. – aitchnyu

+0

Dla bardzo małego przypadku użycia, wydawało mi się, że jest to bardziej złożone niż uzasadnione, aby uniknąć lekko zagnieżdżonego 'if', szczególnie, że potrzebowałem Jetty lub coś podobnego. Gotowe zintegrowane i działające w około godzinę. Może Unfiltered się opłaci, gdy sprawy się bardziej zaangażują. –

1

Oto kilka różnych przykładów umieszczanie pojemników Java i Scala ram:

Chociaż oba te rozmowy o uruchomieniu aplikacji na Heroku, można po prostu uruchom je jako samodzielne aplikacje Scala.

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

Zobacz również scala kittens