2012-03-29 11 views
9

人々がScalaを学ぶのを助けるためのコミュニティリソースとして意図された少しの教育プロジェクトのために、私はバックグラウンドスレッドでWebページを提供して処理する簡単な方法を探しています。Scala:小さなWebサーバーをscalaアプリケーションに埋め込む方法は?

最小の背景:Scalatronは、プレイヤーが(Scalaで書かれた)ボットプログラムをお互いに投げつけるマルチプレイヤーゲームです。 Scalaのチュートリアルを手順を追って説明します。現在、ローカルマシン上でIDEを使用してボットをコンパイルする必要があり、ボットを共有ネットワークディレクトリにコピーしてゲームに公開します。これは面倒です。次のバージョンでは、主催者とプレイヤーの両方の設定を最大限に簡素化するために、ブラウザベースのボットの編集と公開を提供するのが良いでしょう。

私は既にScalaのソースコードをサーバー上に即座に到着させてコンパイルするバックグラウンドスレッドを持っています(完全なIDEの必要性を取り除きます)。次に、プレーヤーのためのアクセスポイントを提供し、ボットのアップロードを処理するために、小さなWebサーバーを実行しなければなりません(これはネットワーク共有を取り除きます)。

要件は非常に基本的なものです。最初は、編集ボックスと「移動」ボタン(サーバーにアップロード、ゲームに公開する&をコンパイル)で1ページを配信することを想定しています。私は、5秒または10秒ごとに、全ユーザーに1回以上のボットアップロードを行わずに、20人以下の同時ユーザーを期待しています。私は各ユーザ(ちょうど名前)のための最小限の状態を保持する必要があり、私はコンパイラのエラーメッセージをユーザに返す必要があります。ゲーム画面の更新はブラウザに表示されるのではなく、サーバーマシンに接続されたプロジェクターに表示されることに注意してください。そして主に、可能な限り簡単なセットアップ(ゲームサーバー.jarをダブルクリックすること)を可能にするために、既存のゲームサーバー内のバックグラウンドスレッドでWebサーバーを実行することはいいと思います。

これを行う最も適切な方法は何ですか? PlayやLiftのような既存のフレームワークを使用する必要がありますか?これに非常によく似た何かをするための既存のコードはありますか?このようなバックグラウンドスレッドでWebサーバーを実行する計画は合理的ですか?アドバイスありがとうございます。

答えて

2

Javaの世界で最もよく使用される小さな埋め込み可能なWebサーバー/サーブレットコンテナの1つはJettyです。 ScalaはJavaライブラリを簡単に使用できるため、Scalaからこのライブラリを簡単に使用できます。

This pageには、組み込みHTTPサーバーとして起動する方法のいくつかの簡単な例(Java形式)が示されています。

+0

グレート、おかげでそれをチェックアウトします! –

+0

私はJettyとすべての仕事をしています。先端に感謝します。 –

0

フレームワークを提供したいのであれば、最良の解決策は、既存のフレームワークを使用することだと思います。そのようにすれば、再発明することに気を使う必要はありません。

本当に主観的な私の個人的な経験から、私はセッション、グローバルスニペットなどのサポートにとって非常に強力であることを知っているので、リフトを使用することをお勧めします。リフトの動作の一例として使用される古典的なchat appを拡張しようとすることができます。

+0

OK、ありがとう、私はそれを見に行きます。 –

3

Embedding Jettyは、Jettyプロジェクトの主な目標の1つです。必要があれば簡単ですが、これが最速のルートです。私はあなたが素早くより堅牢なソリューション(モデル、ルーティング、テンプレートなど)を必要とすると思うので、LiftまたはPlay Frameworkのようなフレームワークを使用する方が良い考えです。

10

組み込みのWebサーバーは、まったくUnfilteredのものです。 Unfilteredの基本的な考え方は、Webサーバーは、Webフレームワークが呼び出すコードではなく、コードから呼び出すライブラリにすぎないということです。ここで

+0

ありがとう、それは素晴らしいね。私はそれを見ます。 –

+0

それは完璧です、私は余分なupvoteを与えることができることを望みます。私は**それを使ってScalaを学ぶプロジェクトを作り**ます。 – aitchnyu

+0

非常に小さなユースケースのために、軽くネストされた 'if'を避けるためには、より複雑なように思えました。なぜなら、それはとにかくJettyかそのようなものが必要なからです。 Jettyを統合して約1時間で作業しました。たぶん、Unfilteredは、物事がより複雑になるときに報われるでしょう。 –

1

は、JavaコンテナとScalaのフレームワークを埋め込むの異なる例のカップルです:

Herokuの上でアプリケーションを実行に関するこれらの話の両方、あなたはできますが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 } 
    } 
    } 
} 

も参照してくださいscala kittens

関連する問題