WorkerRoleへ外部から接続

| コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク

AzureでIronRubyがホスティング出来ないかと作業中に、 WorkerRoleへ外部から接続する方法について挑戦したので、記録しておく。

外部からWorkerロールへの接続

最近、外部のインターネットから WorkerRole へ通信できるように出来るようになったらしい。 ということで、その方法を試してみる。

設定

ソリューションエクスプローラから、WorkerRoleを選択肢、そのプロパティ画面を開く。

20091231_WorkerRole01.png

そして、その中の「EndPoints」を選択しそこに外部から接続するポートを指定する。

20091231_WorkerRole02.png

設定した実際の例は以下のようになる。

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="IronRubyHost" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1">
(snip)
    <Endpoints>
      <InputEndpoint name="IronRubyHttp" protocol="tcp" port="8080" />
    </Endpoints>
(snip)
  </WorkerRole>
</ServiceDefinition>
 
 

今回は、IronRubyポーティング用のプロジェクトを用いて設定していたので、name="IronRubyHttp"としているが、 名前は任意の物を指定できる。

コーディング

次に応答するプログラムを書いてみる。

以下のように書き、実行する。

public override void Run()
{
    Trace.WriteLine("WorkerRole1 entry point called", "Information");

    var port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["IronRubyHttp"].IPEndpoint.Port;

    var listner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    var listen = new IPEndPoint(IPAddress.Any, port);
    listner.Bind(listen);
    listner.Listen(1);

    while (true)
    {

        try
        {
            Socket socket = listner.Accept();
            var buff = System.Text.Encoding.ASCII.GetBytes("Hello");
            socket.Send(buff);
            socket.Close();
        }
        catch (Exception ex )
        {
            Trace.WriteLine("Exception HttpServerProcess ", "Information");
            Trace.WriteLine(ex.ToString(), "Information");
            Trace.WriteLine(ex.StackTrace, "Information");
        }

        Thread.Sleep(10000);
        Trace.WriteLine("Working", "Information");
    }
}
 
 

確認

telnet ソフトから Azureの 8080 ポートへ接続すると、 Hello が表示される。

ポート

注意しておきたいのは、 <InputEndpoint name="IronRubyHttp" protocol="tcp" port="8080" />で指定したポートは 外部インターネットと接続するポート番号であり、各ロールの待ち受け用の番号では ないということである。各ロールで受ける際には、RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["IronRubyHttp"].IPEndpoint.Port のようにして行う。

この点を理解しなかったために、かなり手間取った。

イメージにすると以下のようになる。

20091231_WorkerRole03.png

おわりに

このようにして外部との接続が可能となり、Tomcatなどを動かす事もできるようである。

参考

トラックバック(0)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/55

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2009年12月31日 11:25に書いたブログ記事です。

ひとつ前のブログ記事は「Azure 上でログを記録する方法? 」です。

次のブログ記事は「C#とIronRubyのかけ橋 MutableString」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。