コミュニケーション チュートリアル 3:
UDP ネットワーキング

イントロダクション

このチュートリアルでは、ネットワークを使用したMax メッセージの送信に関する情報を提供します。ここでは、UDP ネットワークプロトコルを使ってメッセージの送受信を行なう udpsend および udpreceive オブジェクトについて検討します。

Max パッチでコンピュータネットワーク処理を実装するには、多くの理由があります。大規模なプロジェクトでは、1台のマシンで扱いきれないような処理を行なう必要があることも少なくありません。このような場合、既存のネットワークを使って、使用されていないマシンのCPUサイクルを「獲得」したり、パフォーマンスパッチ全体の一部分を実行するマシン間で同期メッセージを送信したりすることが役に立ちます。加えて、ネットワークプロトコルは、複数のパフォーマーによって実行されるコンピュータ間で情報を共有する場合にも便利で、離れた場所でも利用することができます。udpsendオブジェクトとudpreceive オブジェクトによる通信は、標準の UDP ネットワークプロトコルを1対の Max オブジェクトに包含させたもので、ネットワーク上の2つのコンピュータ間でのメッセージ送信を容易に行なうことができるようにするものです。

一般的なUDPの概要

UDP プロトコルは、軽くて柔軟な通信プロトコルで、インターネットのアプリケーション間でのデータのやり取りに使用されます。このプロトコルは2つのマシン間での接続の維持を要求しません。むしろ、受信側のアプリケーションは、特定のポートへ送られてくるデータパケット(データグラムと呼ばれます)を監視し、それを入力されたメッセージとして処理します。送信側のプログラムでは、送信先のアドレスと受信するポートを指定する必要があります。

UDP は非常に強固なプロトコルというわけではありません。UDPでは、パケットの到着順序の保証は行なわれず、エラーやパケットの消失を通知する手段も提供されません。しかし、UDP は高速なプロトコルであるため、多くの場合、オーディオやビデオコンテンツのネットワーク送信に使用されています。そして、図らずも、これを使うことによって、Max メッセージによる処理の命令を容易に行なうことができます。

あらゆる型のメッセージの送信

チュートリアルを開いて下さい。チュートリアルを見て下さい。左側には、それぞれ異なった型のMax メッセージが接続された udpsend オブジェクトがあります。これはネットワーク接続の「送信側」になります。udpsend オブジェクトはMax メッセージを受信し、これを UDP データグラムに変換して送信先に送ります。送信先はマシンのTCP/IP アドレスとポートで指定します(オブジェクトのアーギュメントとしてこれを与えます)。"network_receiver" という名前のパッチは、その名前が示すように、このパッチの終端部になっています。このサブパッチを開くと、ポート7000 を監視している udpreceive オブジェクトがあることがわかります。(ここでは、ネットワークアドレスを指定していません。その場合、オブジェクトは「このコンピュータ自身」のポートを監視するよう指定されているとみなします。)

udpsend に接続されているメッセージに何らかの変更を加えると、その変更がサブパッチに反映されることがわかるでしょう。udpsend オブジェクトからは、シンプルなメッセージでも、複雑なメッセージでも送信することができます。multislider は12 個の項目からなるリストを送信します(prepend オブジェクトによって multislider という語が前に追加されているため、このメッセージをroute オブジェクトによって受信側でルーティングすることができます)が、簡単なメッセージでも、これをパッケージ化してネットワーク経由で送信することができます。

この例で使用しているネットワークアドレスについてまず説明しておくべきでしょう。ここでは、自分自身のマシンに限定してテストしたいため、ホストマシンを表す固定のネットワークアドレスを使用する必要があります。これはIP ループバックアドレスと呼ばれるもので、127.0.0.1 というアドレスです。このネットワークアドレスを使用した場合、「外部のネットワークを経由してではなく、送信を内部的にルーティングする」ことを意味します。このパッチを2台のネットワークマシンでテストしたい場合には、受信側のマシンのIP アドレスを使用するようにupsend オブジェクトを変更する必要があります。

基本的なチャットプログラム

このチュートリアルパッチの2つめの部分は、簡単なチャットプログラムの例です。また、ここには、通信が実行されるようすを表示するために使用するサブパッチがあります。ただし、これが2台のマシンの間で動作するためには、簡単な変更を行なわなければなりません。必要な処理は、ネットワークアドレスを、"localhost" (127.0.0.1を表すシンボリックネーム)から、接続されたコンピュータのアドレスに変更するということだけです。パッチのこの部分ではテキスト(textedit オブジェクトに入力されたもの)をポート 7003 から送信し、ポート7002 でメッセージを受信します。

最初の例と異なり、ここでは双方向通信が行なわれるようすが示されています。2つのコンピュータ間で情報を送信する場合、それぞれに udpsend と udpreceive オブジェクトが必要で、udpsend オブジェクトには他のマシンのネットワークアドレスを指定する必要があります。さらに、双方向通信は隣接した2つのポートで行なう約束になっていて、ここではポート7002 と 7003 を使っています。chat_buddy という patcher オブジェクトを開くと、このことがわかるでしょう。この中では localhost を使った通信を行なっていますが、ポートの順序が反対になっています。テキストはポート 7002 で送信され、ポート 7003 で受信されます。これで、チャットパッチの1つ(下にある白い textedit オブジェクト)にテキストをタイプし、リターンキーを押すと、もう1つのパッチのグレーの領域に表示されます。

結び

ネットワークを介したMaxメッセージの送受信を行なう場合には、udpsend オブジェクトと udpreceive オブジェクトを使用します。これらは、あらゆるメッセージやリストの受け渡しを柔軟に処理するために、シンプルで軽いUDPプロトコルを利用します。同一のシステム内では localhost ネットワークアドレスを使用することができますが、これと同じメカニズムによって、ネットワークに接続された他のマシンに対し、ネットワーク経由でメッセージを送信することが可能です。

参照

udpsend UDPを使ってネットワーク経由でMaxメッセージを送信します。
udpreceive UDP を使ってネットワーク経由で Max メッセージを受信します。
textedit パッチ内でユーザによるテキスト入力を行ないます。