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
インタフェース内 AutoCloseable
public 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()