SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Curlで構築する長崎電子県庁システム(ポータル・スケジューラー編)(AD)

Curlで構築する電子県庁システム(ポータル・スケジューラー編)
RSSリーダーとメッセンジャー

  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (2.6 KB)

メッセンジャー

 メッセンジャーには、主に以下の機能があります。

  • スケジューラーを起動している者同士で、簡単なメッセージのやり取りをリアルタイムに行える。
  • 相手が不在の時にメッセージをデータベースに残すことができる。不在の人がスケジューラーを起動した際に、メッセージがあることを通知して後からメッセージを見ることができる。
メッセージの送信画面
メッセージの送信画面
メッセージを受信したときの画面
メッセージを受信したときの画面

UDPソケットの生成

 UDPで送受信を行うときは、UDPパケットの送受信のためのクラスであるUDPSocketを使います。引数で使用するポート番号、タイムアウト時間、データを受信した時に呼ばれるイベントハンドラを指定します。bindメソッドを実行すると送受信できる状態になります。

let v_socket: UDPSocket=
      {UDPSocket
        local-port       = 5000,
        timeout          = Socket.zero-timeout,
        readable-handler =
          {on t: ReadableStreamEvent do
            ||データを受信したときに呼ばれる
            {recv-data-proc}
          }
      }
{v_socket.bind}

UDPで文字列を送信

 文字列を送信するには、UDPSocketクラスのwrite-packetメソッドを使用します。write-packetメソッドで送信できるデータ形式はバイト配列です。よって、送信する前に文字列をencode-charactersプロシージャでバイト配列に変換しています。

{define-proc {my-udp-send-string? p_socket: #UDPSocket,
                                  p_ip: String,
                                  p_port: uint16,
                                  p_data: String
             }: bool
  {if p_socket == null or
      not p_socket.open? then
    {return false}
  }
  let v_enc: CharEncoding =
        {get-character-encoding-by-name "shift-jis"},
      v_outsize: int =
        p_data.size * v_enc.transcode-max-expansion-factor,
      v_out: ByteVec =
        {ByteVec max-size = v_outsize},
      (v_used: int,
       v_outmade: int) =
        {encode-characters p_data, v_out, v_enc},
      v_temp: {Array-of byte} =
        {new {Array-of byte}}
  {for v_byte: byte in v_out do
    {v_temp.append v_byte}
  }
  {return
    {p_socket.write-packet
      v_temp,
      remote-address = {SocketInetAddress p_ip},
      remote-port    = p_port
    }
  }
}

||192.168.1.123に"あいうえお"を送信する
{my-udp-send-string?
  v_socket,
  "192.168.1.123",
  5000,
  "あいうえ"
}

UDPで送信された文字列の受信

 データを受信するときは、UDPSocketクラスを生成するときのreadable-handlerに指定したイベントハンドラで行います。 UDPSocketクラスのread-packetメソッドで、受信したデータを取得します。バイト配列で取得するので、decode- charactersプロシージャを使ってバイト配列から文字列に変換しています。

{define-proc {recv-data-proc}: void
  {try
    let (v_out: #{Array-of byte},
         v_length: int,
         v_remote-address: #SocketInetAddress,
         v_remote-port: uint16) =
          {v_socket.read-packet}
    {if-non-null v_out then
      let v_temp: ByteVec = {ByteVec max-size = v_out.size}
      {for v_byte: byte in v_out do
        {v_temp.append v_byte}
      }
      let (v_num-bytes-decoded: int,
           v_recv: String) =
            {decode-characters
              v_temp,
              {get-character-encoding-by-name "shift-jis"}
            }
              :
            省 略
              :
    }
  catch e: ConnectionAbortedSocketException do
  }
}

 メッセンジャーの機能を応用して、グループメンバのスケジューラーの起動の有無を名前の前のアイコンで分かるようにしました。スケジューラーを起動すると、グループメンバのスケジューラーとメッセージの送受信を開始します。応答がある/なしによってアイコンの切り替えを行っています。

スケジューラーの起動の有無によって名前の前に表示するアイコンの切り替え
スケジューラーの起動の有無によって名前の前に表示するアイコンの切り替え

まとめ

 Curlで、デスクトップアプリケーションのようなRSSリーダー・メッセンジャーが簡単に作成できることがお分かりいただけたと思います。

 3回にわたり、Curlで「ポータル・スケジューラー」を開発するにあたり苦労した点、工夫した点などを書いてきました。本連載で少しでもCurlの良さを伝えることができたならば幸いです。ありがとうございました。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Curlで構築する長崎電子県庁システム(ポータル・スケジューラー編)連載記事一覧

もっと読む

この記事の著者

株式会社ドゥアイネット 前田慎治(マエダシンジ)

株式会社ドゥアイネットに勤務するプログラマーです。制御系から事務系まで様々な開発を経験し、現在はCurlやOpenLaszloを使ってRIAの開発を担当しています。OpenLaszloで開発した「スマートスケジューラー」http://www.dinss.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3470 2009/02/18 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング