tixture55’s diary

主にプログラミング関係の日記です。

Java Network Programmingを読んでみて その1

最近は英語の技術書読んだり、RFClinuxの勉強がメインになってます。今年はc書いたり、python書いたり、いろいろ学習の幅を広げていきたいと思います。今回はJava Network Programmingを読んでの感想です。

 

In fact, writing network programs in Java is quite simple, as this book will show.

Indeed, there is very little application layer network software you can write in C or C++ that you can't write more easily in Java.

 

Java is the first(through no longer the only) language to provide such a powerful cross-platform network library
for handling all these diverse tasks.

 

I hope you'll find this fourth edition an even stronger,I hope you'll find this fourth edition an even stronger,
longer-lived, more accurate, and more enjoyable tutorial and reference to network programming in Java than the previous one.

 

 

シンプルではあるが、既存のCやC++で書かれたソースをJavaで書き直すのは容易ではない。Javaを使うことで多様なタスクをハンドリングできる。14 editionでは、以前のものよりもっと正確で、かつもっと楽しめるチュートリアルとリファレンスが用意されている。

 すごいざっくりな訳ですが、14のバージョンは当然ながら前のバージョンよりも楽しめる内容になっているようです。

 

 

input and output(I/O)input and output(I/O) in Java is organized differently than it is in most other languages, such as Fortran, C, and C++.

 

Filter streams can be chained to either an input stream or an output stream. Filters can modify the data as it's
read or written--- for instance, by encrypting or compressing it----- or they can simply provide additional methods
for converting the data that's read or written into other formats.

 

結局、Cで書いてもC++で書いても暗号化したり、圧縮したりとやってることは同じで、JavaはI/O処理についてはちょっと他の言語と違うんだよということが分かりました。

検索してみると、Javaでは文字コードエンコード、デコードが必要な箇所では大体Streamが使われてるみたいですね。バイトストリームにはInputStreamおよびOutputStreamがあります。および文字ストリームにはReader,Writterがあります。バイトストリームはメモリ上に保持するだけです。

  • ByteArrayInputStream
  • ByteArrayOutputStream

 Javaにおいて、

public static byte[] getBytes(char[] chars, String encordingsetName) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();

        Writer writer = null;
        try {
            writer = new OutputStreamWriter(os, encordingsetName);
            writer.write(chars);
            writer.flush();
        } catch (IOException ioe) {
            handleIOException(ioe);
        } finally {
            closeStreams(writer);
        }
        return os.toByteArray();
    }

 のようなStreamを使ったメソッドがありますが、ここで使われているwrite.flush()はバッファに書き込まんだ内容をHDDなどに恣意的に書き込む処理です。ちなみにclose()を呼んでもflush()が行われています。

ソケットとは

双方がデータのやりとりを行う際、双方を結んで情報を運ぶための線が必要となります。Javaにおいてはこの線のことを「ソケット」と呼びます。仮にAとBという2つのプログラムが通信を行うとすれば、一方の通信線がAにとっての「InputStream」であり、かつBにとっての「OutputStream」となります。

 通信を始める一番最初の段階ではまだこのソケットは2つのプログラムを結んでいません。クライアント側からサーバ側にソケットが送り込まれて初めて通信が開始されます。

 

詳細な仕様や実際のソースコードを読む作業を引き続きやっていこうと思います。

 

まとめ

今回は序盤をさらっとなめただけですが、徐々に読み進めていこうと思います。

 

 

参考サイト

第8講・その1 Javaプログラムにおける通信のしくみを理解する

Javaにおける文字コードまわりの話(4) - あしのあしあと

www.atmarkit.co.jp