お知らせ

Javaでソケット通信(ジャバソケ)

ソケット?
ソケット通信?
ハ?ナンスカソリャ(o´・∀・)y~

たぶん、恐らく、普通のIT戦士ならば知っていること。
ぼかぁ、なんちゃってエンジニアなので、知りませんでした。

でも、ソケット通信するプログラムを作らにゃならんことになりました。
そこで、今回えんやこらしたいきさつを、ここにメモります。

ソケット通信とは何か。
何かしらのデータを、何かしらの仕組みでやりとりすることらしい。
ふぅん。それってパケット通信とどう違うの?ヨクワカラナイネ。

えんやこらしたあげくに、僕は以下のように理解しました。

引きこもりニートが、毎日、母親に夕飯を部屋まで届けてもらうケースを考えます。
すると、以下のような手続きが想定できますね。

(1)お母さんは、ニートの部屋のドアをコンコンする。
(2)ニートが、「なんの用じゃババア!」と返事する。
(3)お母さんは、「夕飯持ってきた、ここ置いとくで」と言う。
(4)ニートが、「わかった」と返事する。

これを、ソケット通信で例えると、以下のようになります。
ニート・・・ソケットA
夕飯・・・データ
お母さん・・・ソケットB

ふむふむ。

データを持ってくる人がいて、
データを受け取る人がいて、
コンコン→なんの用じゃ→置いとくで→わかった。という流れがある。

ほほぅ。べりぃイージーれすねぃ(o´・∀・)y~

で、こういうやりとりを、プログラムではどうするかっちゅうと、
Javaでは簡単にでけますた。

今回作る必要があったのは、受け取る側。
つまり、引きこもりニートを作りました。

以下、サンポォソース(サンプルソース)

/**
* ええ年こいて働きにも出んと、毎日部屋に引きこもって、
* 夕食はお母さんに部屋まで届けてもらっているニートのプログラム
* めんどくさいのでエラー処理は省いています。ニートはめんどくさがりです。
*
* @author KaZ
*/
public class Neet {

// ニートの本体
    public static void main(String[] args) {

// ニートはポートを開きます(ニートポート5000番)
        ServerSocket neetSocket = new ServerSocket(5000);

// 働きにも出んとコンコンされるのをただただ待ち続けます
while(true)
{

// お母さんにコンコンされます
            Socket mamaSocket = serverSocket.accept();

// メシを受け取る準備をします(モノもらうときだけは一丁前に動きます)
            InputStream inStream = mamaSocket.getInputStream();
byte[] meshi = new byte[ 100 ];    // 100バイト分の受け取り皿を用意

// メシを受け取ります(中身はともかく、くれるもんはもらう主義です)
            inStream.read(meshi, 0, 100);

// 受け取ったので閉じます
            inStream.close();

// もちろんお母さんはもう不要なので追い出します
            mamaSocket.close();    // 入ってくんな!でていけババア!

// ほくほくしながらメシをのぞいてみます
            String meshiNoNakami[] = new String(meshi);    // 中身を文字列にしてみる

// メシの中身を文字列で出力
            System.out.println(meshiNoNakami);

}
}
}

きゃっほう!ニートの生活ってイージー!イージー!(o´・∀・)y~

しかし、驚くべきことに、
このプログラムはうまく動かない場合があるのです。

それは、お母さんが、なかなかメシを渡さないイジワルババアの場合です。
例えるならば、じらすかのようにオカズ、一皿ずつ渡されるとき。

そうです。お母さんは、
必ずしも、一回の手続きでメシを全品くれるとは限らないのです。

だから、以下の一行をループ処理に書き換えます。

// メシを受け取ります(中身はともかく、くれるもんはもらう主義です)
inStream.read(meshi, 0, 100);

↓↓↓↓↓↓↓↓↓

// 一時的な変数をご用意
int ima_moratta_sara = 0;    // たった今受け取った皿の数
int imamadeno_sara = 0;        // 今まで受け取った皿の数

// メシが全品そろうまで、受け取り続ける
while(メシが全品そろわない限り)    // ここの条件はお好みで
{
// たった今受け取った皿の数を覚えておきます
ima_moratta_sara = inStream.read(meshi, imamadeno_sara, 100 – imamadeno_sara);

// 今まで受け取った皿の数に加算します
    imamadeno_sara += ima_moratta_sara
}

これで、ニートは腹いっぱいメシを食えるちゅうことですね(o´・∀・)y~
おわり。