.NET Micro FrameworkでNetduinoに非同期TCPサーバーを実装する

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
netduino-nostalgic

.NET Micro Framework には TcpListenerTcpClient などがなく、非同期メソッドもありませんので Socket を使って自力で実装する必要があります。

今回はTCPで非同期通信する汎用のサーバークラス AsyncTcpServer を紹介します。少し改造すれば Web サーバーになります。
.NET Micro Framework(以下、MF)のバージョンは 4.1 、テスト環境は Netduino Plus です。

スポンサーリンク

サンプルコード

機能としては非常にシンプルです。クライアントの接続要求を受け付けて、データを受信して、それに応答したら切断するだけ。受信バッファなどをラッピングしてあるので、使う側のコードは下記のように非常にシンプルです。

クライアントから送受信テストしたところ Accept~Receive~Send~Close まで、ごく短い文字列(10文字程度)で、約 3ms ぐらいでした。

テスト環境は固定 IP 設定でしたので、はじめの 3 行で IP 設定をしています。
サーバーの初期化はその下の 3 行だけです。

メインスレッドが終了してしまわないように無限ループにスリープをいれています。ちなみにこのスリープがないと Netduino が応答しなくなりますので、ご注意を。

AsyncTcpServer クラス

ソースコードは最後につけてあります。

基本的な流れは、クライアントからの接続を待機し、接続があれば Accept し、データを受信したら Received イベントを発生させ、Send メソッドでなんらかのデータを返して、接続を切る。という感じです。

Accept がブロッキングメソッド(スレッドの流れをブロックするメソッド)ですのでこれを別スレッドに移すことでメインスレッドのほうでは別の処理を続けることができます。

ただし、一つの接続がきれたら、次の接続を待つ。という流れですので、受信・送信中に別のクライアントが接続してきたときは反応できません。複数同時接続が必要なときはさらに受信ルーチンを別スレッドにする必要があります。
Received イベントの中で数十 ms 以上の重い処理をする場合は受信ルーチンも別スレッドにしたほうがいいと思います。

ソースコード

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存