Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@newta

CeylonからJavaのクラスを使ってみる。(HttpServerコード)

今回は移行ではあるあるの状態になりそうな
Javaのクラスを利用しつつCeylonで書こうってことをやってみようと思います。

何を作ろうかなーと考えてたところ
JavaでHttpServerを手軽に起動する方法が
こちらの記事 に書かれているのを見つけたので
これを参考にJavaのHttpServerのクラスを利用してCeylon上で書いてみます。

まず設定

プロジェクトを右クリックして
Properties > Ceylon Compiler
にある
Enable java classes
にチェックを付けます。
(これをチェックするとおそらくJavaScriptエンジンでは利用出来なくなります)

スクリーンショット 2013-12-05 13.34.44.png

今回使うライブラリをモジュール設定に足す

作成したモジュールで生成された
module.ceylonに
利用するパッケージの設定を追記します。

モジュールの作成などの基本的な方法は こちら

module com.hello.jserver "1.0.0" {
    import ceylon.interop.java "1.0.0";
    import java.base "7";
    import oracle.jdk.httpserver "7";
}

今回はcom.sun.netなoracleから提供されているjavaライブラリを使うので

import oracle.jdk.httpserver "7"

が一番重要な追記ポイントです。

コード

という訳で、早速コードをどーん!


import com.sun.net.httpserver {
    HttpServer,
    HttpExchange,
    HttpHandler
}

import java.io {
    OutputStream
}
import java.net {
    InetSocketAddress
}
import java.util.concurrent {
    Executors,
    ExecutorService
}

void runServer(){

    HttpServer httpServer = HttpServer.create(InetSocketAddress("localhost" ,8080),8080);
    ExecutorService httpThreadPool = Executors.newFixedThreadPool(1);
    httpServer.executor = httpThreadPool;

    object httpHander satisfies HttpHandler {

      shared actual void handle(HttpExchange exc) {
          String response = "Hello HTTP Server" ;
          exc.sendResponseHeaders(200, response.size);
          OutputStream os = exc.responseBody;
          for ( Character i in response.characters) {
              os.write(i.integer);                              
          }
          os.close();
      }
    }
    httpServer.createContext( "/" , httpHander);
    httpServer.start();

}

元のJavaの記事のコード と見比べてもあまり変わらずさらっと読めるかなと思いますー。
少し違うのはoverrideのアノテーションが消えてactualがついていること。

意図的に変えた部分はテストじゃないのでサーバのシャットダウンはしないようにしてあります。
それとHttpHandlerのインスタンス生成とhttpServer.createContextで渡すときに
変数に1度代入してるとこくらいです。

それ以外の部分はクラスもそのまま使っていますし、
メソッドもそのままです。

Javaからやってもすぐ出来そうですよね!

という訳で実行してブラウザで
localhost:8080にアクセスすると

Hello HTTP Server

と表示されました!

今回は以上ー。
次回はJavaのライブラリではなくCeylonのライブラリを使って
HTTPサーバを書いてみようと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?