2010年7月11日日曜日

Socketの勉強をしよう - Java

overlayweaverのdhtshellを解読してたら
private Socket sock;

こんな変数を見つけたのがことの始まりでした。
なにこれ?ってことで、

P2Pにとっては、かなり重要そうな感じがしたので勉強することに

メモ
java.net.Socket
「このクラスは、クライアントソケット (単に「ソケット」とも呼ばれる) を実装します。ソケットとは、2 つのマシン間で通信を行う際の端点のことです。」

java.net.ServerSocket
「このクラスはサーバーソケットを実装します。サーバーソケットは、ネットワーク経由で要求が送られてくるのを待ちます。これは、その要求に基づいていくつかの操作を実行します。その後、場合によっては要求元に結果を返します。」


それでは、勉強開始!!
JavaでHelloWorld ソケット編というのを参考に

まずは、サーバー側のソースコード
package socket;

import java.io.*;
import java.net.*;

public class HelloWorldMultiThreadServer {
 public static void main(String argv[]) {
  try {
   // 指定されたポートにバインドされたサーバーソケットを作成します。
   ServerSocket serverSocket = new ServerSocket(5555);

   // メインループ
   while (true) {
    try {
     System.out.println("クライアントからの接続をポート5555で待ちます");
     // accept()は serverSocketに対する接続要求を待ち、それを受け取ります。
     Socket socket = serverSocket.accept();
     System.out.println(socket.getInetAddress() + "から接続を受付ました");

     // 処理をスレッドに任せます
     new Connect(socket);

    } catch (Exception ex) {
     ex.printStackTrace();
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

class Connect extends Thread {
 private Socket socket = null;

 public Connect(Socket socket) {
  this.socket = socket;
  // スレッド開始
  this.start();
 }

 public void run() {
  try {
   // ソケットの出力ストリームを取得
   PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
   // ソケットの入力ストリームを取得
   BufferedReader in = new BufferedReader(new InputStreamReader(
     socket.getInputStream()));

   // 読み込んだ行をそのまま出力ストリームに書き出す
   String inputLine;
   while ((inputLine = in.readLine()) != null) {
    out.println(inputLine);
   }
   System.out.println("処理が終了したので接続を切ります");

   // 入出力ストリームを閉じる
   in.close();
   out.close();
   // ソケットを閉じる
   socket.close();
  } catch (Exception e) {
   try {
    socket.close();
   } catch (Exception ex) {
    e.printStackTrace();
   }
  }
 }
}
次に、クライアント側のソースコード
package socket;

import java.net.*;
import java.io.*;

public class HelloWorldSocketClient {
 public static void main(String[] args) {
  try {
   // ストリームソケットを作成し、指定された IPアドレスの指定されたポート番号に接続します。
   Socket socket = new Socket("localhost", 5555);

   // ソケットの出力ストリームを取得
   PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
   // ソケットの入力ストリームを取得
   BufferedReader in = new BufferedReader(new InputStreamReader(
     socket.getInputStream()));

   // 「Hello World」をサーバーに送る
   out.println("Hello World");
   // 読み込んだデータを表示
   System.out.println(in.readLine());

   // 入出力ストリームを閉じる
   out.close();
   in.close();
   // ソケットを閉じる
   socket.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

このソースコード書いた人すごいなー。
ソースコード読んだだけでソケットがなんとなくわかっちまったぜ。

ちょっと引っかかってしまったのが、入出力ストリーム。
感覚的にはわかったんだが、理解はしてない。
あとで、勉強だな。


参考文献
JavaでHelloWorld ソケット編

0 件のコメント:

コメントを投稿