public static class hiSocket.TCP.ForObject<T> extends Object implements AutoCloseable
      socketによるObjectInputStreamとObjectOutputStreamをまとめたものです。
      シリアライズ可能なクラスObjectの送受信用です。
      
例えばStringオブジェクトを送受信する通信機はForObject<String>となり MyClassオブジェクトを送受信する通信機はForObject<MyClass>となります。
      データ送受信用socketであり、クライアント側でもサーバ側でも使用します。
      クライアント側での接続はconnect(String,int,int)で行います。
      サーバ側での接続はjava標準のjava.net.ServerSocketを用い、
      connect(ServerSocket,int)で行います。
      
次のようにデータの送受信ができます。
      // シリアライズ可能なクラス
      public class MyClass implements java.io.Serializable {
         static final long serialVersionUID = -6024830152996776507L;
         public int    id;
         public String s1;
         public String s2;
         public MyClass(int id_,String s1_,String s2_){
            id= id_;
            s1= s1_;
            s2= s2_;
            }
         public String toString(){
            return "[id="+id+" s1="+s1+", s2="+s2+"]";
            }
         }
      // サーバ側
      import otsu.hiNote.*;
      import java.net.*;
      public class TestS {
         final static int default_port=5963;
         final static int time_out    =60000;//60秒
         public static void main(String[] args_){
            try{
               ServerSocket           con = new ServerSocket(hiU.atoi(args_[0],default_port));
               ForObject<MyClass> sock= new ForObject<MyClass>(con,time_out);
               MyClass data=new MyClass(1,"abc","xyz");
               for(int i=0;i<5;++i){
                  sock.write(data);
                  if( (data=sock.read(hiU.END_AT_EOF))==null ) break;
                  System.out.println("S received data="+data);
                  ++data.id;
                  data.s1= data.s1+"_XX";
                  }
               sock.close();
               }
            catch(Exception e){
               e.printStackTrace(hiU.err);
               System.exit(1);
               }
            }
         }
      // クライアント側
      import otsu.hiNote.*;
      public class TestC {
         final static int default_port=5963;
         final static int time_out    =60000;//60秒
         public static void main(String[] args_){
            try{
               ForObject<MyClass> sock
                    = new ForObject<MyClass>("localhost",hiU.atoi(args_[0],default_port),time_out);
               MyClass data;
               while( (data=sock.read(hiU.END_AT_EOF))!=null ){
                  System.out.println("C received data="+data);
                  ++data.id;
                  data.s1= data.s1+"_AA";
                  sock.write(data);
                  }
               sock.close();
               }
            catch(Exception e){
               e.printStackTrace(hiU.err);
               System.exit(1);
               }
            }
         }
      // 実行
      java TestS 5006
      java TestC 5006
      // 出力
      クライアント側
      C received data=[id=1 s1=abc, s2=xyz]
      C received data=[id=3 s1=abc_AA_XX, s2=xyz]
      C received data=[id=5 s1=abc_AA_XX_AA_XX, s2=xyz]
      C received data=[id=7 s1=abc_AA_XX_AA_XX_AA_XX, s2=xyz]
      C received data=[id=9 s1=abc_AA_XX_AA_XX_AA_XX_AA_XX, s2=xyz]
      サーバ側
      S received data=[id=2 s1=abc_AA, s2=xyz]
      S received data=[id=4 s1=abc_AA_XX_AA, s2=xyz]
      S received data=[id=6 s1=abc_AA_XX_AA_XX_AA, s2=xyz]
      S received data=[id=8 s1=abc_AA_XX_AA_XX_AA_XX_AA, s2=xyz]
      S received data=[id=10 s1=abc_AA_XX_AA_XX_AA_XX_AA_XX_AA, s2=xyz]
      
      
      // 補足
      hiU.atoi(args[0],default_port)はデフォルト値を持つintの文字列解析です。
      
この例ではシリアライズ可能なクラスMyClassデータを2つの プロセスで互いに送受信しています。
      シリアライズ可能なクラスとはjava.io.Serializableをimpliement
      したクラスであり、特にその為のメソッドは必要としません。
      serialVersionUIDの設定が推奨されており、この値はjavaのbinに
      含まれるserialverコマンドで得ることができます。
      
なお、ObjectInputStreamのnewは実際にデータを受信するまで ブロックされてしまいます。本クラスでは最初の 受信要求時にOujectInputStreamを生成することに より現実的な仕様を実現しています。
      単純にバイト列を送受信する通信機hiSocket.TCPと
      テキストを送受信する通信機hiSocket.TCP.ForTextも用意されて
      います。
      
| 修飾子とタイプ | フィールドと説明 | 
|---|---|
| boolean | autoFlush自動フラッシュ指定. | 
| ObjectInputStream | oisオブジェクト受信用stream. | 
| ObjectOutputStream | oosオブジェクト送信用stream. | 
| Socket | socket接続したsocket | 
| コンストラクタと説明 | 
|---|
| ForObject()接続されていない状態のインスタンスを作る. | 
| ForObject(ServerSocket con_,
         int timeout_)サーバ側でコネクトしたソケットを生成する. | 
| ForObject(String serverName_,
         int serverPort_,
         int timeout_)クライアント側でコネクトしたソケットを生成する | 
| 修飾子とタイプ | メソッドと説明 | 
|---|---|
| void | close()socketおよびstreamをcloseする(exceptionはない) | 
| void | connect(ServerSocket con_,
       int timeout_)サーバ側でコネクトする. | 
| void | connect(String serverName_,
       int serverPort_,
       int timeout_)クライアント側でコネクトする. | 
| void | flush()送信flushする. | 
| T | read()オブジェクトを受信する(EOFはException). | 
| T | read(long option_)オブジェクトを受信する(EOFでnullを返す). | 
| void | setTimeout(int timeout_)受信待ちのタイムアウト設定. | 
| void | write(T obj_)オブジェクトを送信する. | 
public Socket socket
public ObjectInputStream ois
public ObjectOutputStream oos
public boolean autoFlush
public ForObject()
public ForObject(String serverName_, int serverPort_, int timeout_)
serverName_ - サーバー側名前serverPort_ - ポート側のポートtimeout_ - タイムアウトミリ秒(ただし1000ミリ代のみ見る)RuntimeException - IOExceptionをcauseとして持つ。public ForObject(ServerSocket con_, int timeout_)
サーバ側でソケットのコネクトをします。
int port= 5004; ServerSocket con = new ServerSocket(port); ForObject<MyClass> sock= new ForObject<MyClass>(con,60);
con_ - サーバのコネクトポイントtimeout_ - タイムアウト時間(ミリ秒)RuntimeException - IOExceptionをcauseとして持つ。public void connect(String serverName_, int serverPort_, int timeout_)
serverName_ - サーバー側名前serverPort_ - ポート側のポートtimeout_ - タイムアウトミリ秒(ただし1000ミリ代のみ見る)RuntimeException - IOExceptionをcauseとして持つ。public void connect(ServerSocket con_, int timeout_)
サーバ側でソケットのコネクトをします。
int port= 5004; ServerSocket con = new ServerSocket(port); ForObject<MyClass> sock= new ForObject<MyClass>(); sock.connect(con,60);
con_ - サーバのコネクトポイントtimeout_ - タイムアウト時間(ミリ秒)RuntimeException - IOExceptionをcauseとして持つ。public void close()
close インタフェース内 AutoCloseablepublic void setTimeout(int timeout_)
soTimeoutをセットします。
次の操作を行います。
socket.setSoTimeout(timeout_);
timeout_ - タイムアウト時間(ミリ秒)RuntimeException - IOExceptionをcauseとして持つ。public void write(T obj_)
オブジェクトを送信します。オブジェクトがnullの場合は無視されます。
標準ではwriteでflushします。
flushしたくない場合はautoFlush=falseとしてください。
obj_ - 送信するオブジェクトpublic T read()
public T read(long option_)
オブジェクトを受信します。
引数にhiU.END_AT_EOFを指定すれば、EOF時にnullを
返します。
option_ - オプションpublic void flush()