Java:リモート接続ごしでファイルを読み書き

文:Jeff Hanson(TechRepublic)  翻訳校正:原井彰弘
2007-12-19 14:20:01
  • このエントリーをはてなブックマークに追加

前回の記事「Javaの入出力ストリームを用いたデータ操作」では、入出力を行うクラスやインタフェースを調べ、Javaプラットフォーム上でどのような操作を行うことが可能であるかを検証した。

本稿でも、Javaプラットフォームで提供されている入出力機能について引き続き調べていくが、今回は、ローカルのファイルシステムを読み書きするために用いられているテクニックやクラス、データ型が、リモート接続の通信を行う際にも同様に用いることが可能なことをお見せしたい。

ネットワークとは

一般的に、一台のコンピュータに向かうデータは、一本の物理的な接続部を通して送られてくる。ここで問題となることは、この物理的な接続部では、さまざまなプロトコルを利用した多くの種類のデータが、ときには同時に通過するということである。では、単純なデバイスは一体どのようにしてこの問題に対処しているのだろうか?実は、この問題は「ポート」いう概念を用いることによって、マシンが解決している。ポートによって、まるで無限の物理的な接続が実際に存在しているかのように、他のマシンに見せかけることが可能なのである。

ポートとは単なる番号のことであり、データを適切なアプリケーションにルーティングするためにシステム内で用いられている。ポート番号の中には、特定のサービス向けに利用目的が限られている「ウェルノウンポート」と呼ばれるものが存在する。たとえば、HTTPやFTP、SMTPなどにはウェルノウンポート番号が割り当てられている。ちなみに、このウェルノウンポート番号は、0番から1023番までのポートと定められている。ネットワーク上でデータが送信される際には、このポート番号が、送信先のコンピュータを特定するために必要な情報と共に、データに付加されるのである。このしくみが、アプリケーションにおける通信機能に大きな可能性をもたらしている。それは、ハッカーにとっても好都合であるのだが、その問題に関する議論はまた別の機会に行うこととしよう。

Javaのネットワークアプリケーションは、大きく分けてTCP(コネクション確立型)とUDP(コネクションレス型)の2種類の通信を意識して作られる。コネクション確立型の通信では、アプリケーションは「ソケット」と呼ばれるエンドポイントを特定のポート番号に関連づける。この設定によって、システムはアプリケーションへ送られるデータを指定されたポートへルーティングする。一方、コネクションレス型の接続では、個々のパケットはポート番号と共に特定のターゲットに向けてブロードキャストされる。

このような技術屋の話は、まったく理解不能かもしれない。しかし、幸いなことにJavaにはjava.netパッケージがある。このパッケージに含まれているクラスやインタフェースを利用することで、抽象化された一連の機能を用いて、ネットワーク通信機能を持つアプリケーションを開発できるのである。

java.netパッケージ

Javaプラットフォームが提供しているjava.netパッケージには、Socketというクラスが含まれている。SocketクラスはJavaプログラム間での複数の接続のうち一つを表しており、個々のネイティブシステムで実行されている複雑な詳細を隠蔽する役割を持っている。java.net.Socketクラスを用いることで、プラットフォームを意識せずにネットワーク上で通信を行えるようになるのである。さらに、java.netパッケージにはクライアントとの一つの接続を管理するServerSocketというクラスも含まれている。このクラスは、サーバ指向のアプリケーションでクライアントアプリケーションからの接続を受け付ける際に利用される。

java.netパッケージには、TCPやUDPを用いたアプリケーションの開発に必要なクラスやインタフェースが用意されている。TCPを用いて通信するアプリケーションではURLクラス、URLConnectionクラス、Socketクラス、ServerSocketクラスが、一方、UDPを用いて通信するアプリケーションではDatagramPacketクラス、DatagramSocketクラス、MulticastSocketクラスが使用される。

ソケットに対する読み書き

java.netパッケージに含まれているソケットのクラスを用いる場合、最初に通信先との接続を初期化した上で、データの読み書きを行う必要がある。ソケット接続に対してデータの読み書きを行うには、まずソケットから入力ストリームもしくは出力ストリームを取得し、ローカルファイルシステムにあるファイルに書き込むのと同様の手法で、ストリームに読み書きを行えばよい。

  • 新着記事
  • 特集
  • ブログ