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~
おわり。