お知らせ

  • 超科学戦隊オレ一人

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

noimage

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