Java 入門

ホーム > 基本的な I/O > ソケットの読み込みと書き込み

ソケットの読み込みと書き込み

ここまでで、テキストファイルバイナリファイルオブジェクトのシリアライズとデシリアライズをみてきました。

最初はナントカストリームとか、カントカリーダー・ライターとか、いろいろと紛らわしかったかもしれませんが、だいぶ慣れてきたのではないでしょうか。

ここではついでに調子にのって、ソケットでも同じことができることをみてみようと思います。

ソケットについてはまた別の機会に詳しく説明することにしますが、ここでは簡単なサーバーとクライアントを作ってネットワーク上のデータの受け渡しをしてみましょう。

ServerSocket

サーバーのコードはこの通り。

package com.keicode.java.test;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTestServer {
  public static void main(String[] args) {
    
    try {
      System.out.println("--- Start Server ---");
      System.out.println("Listening on 0xbeef");
      
      ServerSocket serverSocket = new ServerSocket(0xbeef);
      Socket socket = serverSocket.accept();
      
      System.out.println("Accept returned!");
      
      DataInputStream inStream = 
        new DataInputStream(socket.getInputStream());
      
      int i;
      while( (i = inStream.read()) != -1 ){
        System.out.print("Read one character...");
        if( i == 'x' ){
          System.out.println("x! break read-loop.");
          break;
        }
        if(0x1f<i && i<0x7e){
          System.out.println((char)i);
        }
      }
      
      inStream.close();

      System.out.println("--- Exit Server. Bye! ---");
      
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }
}

サーバー側は ServerSocket の 127.0.0.1 のポート 0xbeef で接続を待ちます。

accept メソッドで接続を待ち、ストリームからデータを読み文字データを出力します。文字 'x' を受け取ったらストリームをブチ切りして処理を終了します。

クライアント側

クライアント側は次のとおり。

package com.keicode.java.test;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTestClient {

  public static void main(String[] args) {
    
    try {
      Socket socket = new Socket("127.0.0.1", 0xbeef);
      DataOutputStream outStream = new DataOutputStream(
        socket.getOutputStream());
      
      outStream.write('H');
      outStream.write('e');
      outStream.write('l');
      outStream.write('l');
      outStream.write('o');
      outStream.write('!');
      
      outStream.write('x'); // Beef Protocol :-)
      
      outStream.close();

      
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    

  }

}

同じく 127.0.0.1 の 0xbeef に接続して、その出力ストリームに対して Hello!x を送ります。

サーバー側はこれを受け取って、最後の x がきたところで読み込みループを終了して、接続をブチ切る予定です。

これを実際に動かした結果は次のようになりました。

まずサーバーを起動。accept で接続待ちになります。

Socket とストリームの例

ここでクライアントを起動。クライアントは起動したら直ちにソケットに対して Hello!x を送り、サーバーはそれを受け取ったら 標準出力に出力。x を受け取ったら終了します。

Socket とストリームの例

実際に思ったように動作しました。

ホーム > 基本的な I/O > ソケットの読み込みと書き込み