オブジェクトのソケット通信

 オブジェクトを送受信するソケット通信のサンプルコードが見つからなかったので,ここで晒します.
 「形態素解析を高速に処理&クライアント側に形態素解析器環境不要」を実現したかったので,``ArrayList''を送受信するオブジェクトにしています.

HelloWorldMultiThreadServer.java

import java.net.ServerSocket;
import java.net.Socket;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class HelloWorldMultiThreadServer {
  public static void main(String argv[]) {
    try {
      // サーバーソケットの生成
      ServerSocket serverSocket = new ServerSocket(5555);

      // メインループ
      while(true) {
        try {
          System.out.println("クライアントからの接続をポート5555で待ちます");
          Socket s = serverSocket.accept();
          ArrayList<String> data = new ArrayList<String>();
          
          // 受信
          ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
          data = (ArrayList<String>)(ois.readObject());
          
          // データ加工(ここでは頭に0を付与
          for(int i=0; i<data.size(); i++){
            data.set(i, "0" + data.get(i));
          }
          
          // 返信
          ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
          oos.writeObject(data);
          
          // ソケット削除
          s.close();
          
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

HelloWorldSocketClient.java

import java.net.ServerSocket;
import java.net.Socket;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class HelloWorldSocketClient {
  public static void main(String[] args){
    ArrayList<String> data = new ArrayList<String>();
    data.add("サンプルテキスト1");
    data.add("サンプルテキスト2");
    
    try{
      // ソケットを生成
      Socket socket = new Socket("localhost", 5555);
      
      // オブジェクト出力ストリーム
      ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream() );
      // 書き出し
      oos.writeObject(data);
      
      // オブジェクト入力ストリーム
      ObjectInputStream ois = new ObjectInputStream( socket.getInputStream() );
      data = (ArrayList<String>)( ois.readObject() );
      
      // 出力
      for(String line : data){
        System.out.println(line);
      }

      // ソケットを削除
      socket.close();
    } catch(Exception e){
      e.printStackTrace();
    }
  }
}