public static class hiSocket.TCP extends hiRef.V2<InputStream,OutputStream> implements AutoCloseable
socketのInputStream
とOutputStream
をまとめたものです。
バイト列の送受信に使います。
データ送受信用socketであり、クライアント側でもサーバ側でも使用します。
クライアント側での接続はconnect(String,int,int)
で行います。
サーバ側での接続はjava標準のjava.net.ServerSocket
を用い、
connect(ServerSocket,int)
で行います。
送信用のメソッドwrite(byte[],int,int)
と受信用の
メソッドread(byte[],int,int)
を持ちます。
変数value1とvalue2を持ち、
value1がBufferedInputStream
でvalue2がBufferedOutputStream
となります。
何れもconnect時に接続socketから作成されます。
これらを利用することも可能ですが、通常は本クラスに用意された
read/writeを用います。
例えば次のようにデータの送受信ができます。
// サーバー側
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 = hiSocket.newServerSocket(hiU.atoi(args[0],default_port));
hiSocket.TCP sock= new hiSocket.TCP(con,time_out);
byte data[]={1,2,3,4};
for(int i=0;i<5;++i){
sock.write(data,0,4);
if( (sock.read(data,0,4))==-1 ) break;
System.out.println("S received data="+hiU.str(data));
++data[0];
}
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{
hiSocket.TCP sock
= new hiSocket.TCP("localhost",hiU.atoi(args[0],"port-num"),time_out);
byte data[]=new byte[4];
while( (sock.read(data,0,4))!=-1 ){
System.out.println("C received data="+hiU.str(data));
++data[0];
sock.write(data,0,4);
}
sock.close();
}
catch(Exception e){
e.printStackTrace(hiU.err);
System.exit(1);
}
}
}
// 実行
java TestS 5006
java TestC 5006
// 出力
クライアント側
C received data=[1, 2, 3, 4]
C received data=[3, 2, 3, 4]
C received data=[5, 2, 3, 4]
C received data=[7, 2, 3, 4]
C received data=[9, 2, 3, 4]
サーバ側
S received data=[2, 2, 3, 4]
S received data=[4, 2, 3, 4]
S received data=[6, 2, 3, 4]
S received data=[8, 2, 3, 4]
S received data=[10, 2, 3, 4]
// 補足
hiU.atoi(args[0],default_port)
はデフォルト値を持つintの文字列解析です。
hiU.str(data)
はjava.util.Arrays.toString(data)
でも
構いません。長くなるのでhiUのメソッドを使いました。なおArrays.toString()は配列以外受け付け
ませんがhiU.str()は単純Objectでも表示可能でありシンプルになります。
シリアライズ可能なクラスオブジェクトを送受信する通信機
hiScket.TCP.ForObject<T>
と
テキストを送受信するための通信機hiSocket.TCP.ForText
が
別途用意されています。
修飾子とタイプ | クラスと説明 |
---|---|
static class |
hiSocket.TCP.ForObject<T>
socketによるシリアライズObjectのジェネリック送受信機.
|
static class |
hiSocket.TCP.ForText
テキスト送受信機能を持つsocket.
|
コンストラクタと説明 |
---|
TCP()
接続されていない状態のインスタンスを作る.
|
TCP(ServerSocket con_,
int timeout_)
サーバ側でコネクトする.
|
TCP(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する.
|
static hiSocket.TCP |
newSocket()
接続されていない状態のインスタンスを作る.
|
static hiSocket.TCP |
newSocket(ServerSocket con_,
int timeout_)
サーバ側でコネクトする.
|
static hiSocket.TCP |
newSocket(String serverName_,
int serverPort_,
int timeout_)
クライアント側でコネクトする.
|
int |
read()
1バイト読み込む.
|
int |
read(byte[] b_,
int off_,
int len_)
指定バイト受信する.
|
void |
set_timeout(int timeout_)
socketのso-timeout値をセットします。
|
void |
write(byte[] b_)
指定バイトを送信する.
|
void |
write(byte[] b_,
int off_,
int len_)
指定バイトを送信する.
|
void |
write(int b_)
1バイト送信する.
|
void |
writeNoFlush(byte[] b_)
指定バイトを送信する(flushしない).
|
void |
writeNoFlush(byte[] b_,
int off_,
int len_)
指定バイトを送信する(flushしない).
|
void |
writeNoFlush(int b_)
1バイト送信する(flushしない).
|
public Socket socket
public boolean autoFlush
public TCP()
public TCP(String serverName_, int serverPort_, int timeout_)
serverName_
- サーバー側名前serverPort_
- ポート側のポートtimeout_
- タイムアウトミリ秒(ただし1000ミリ代のみ見る)RuntimeException
- IOException
をcauseとして持つ。public TCP(ServerSocket con_, int timeout_)
サーバ側でソケットのコネクトをします。
int port= 5004; ServerSocket con = new ServerSocket(port); TCP sock= new hiSocket.TCP(con,60);
con_
- サーバのコネクトポイントtimeout_
- タイムアウト時間(ミリ秒)RuntimeException
- IOException
をcauseとして持つ。public static hiSocket.TCP newSocket()
hiSocket.TCP _tcp= hiSocket.TCP.newSocket(); hiSocket.TCP _tcp= new hiSocket.TCP();//と同じ
public void connect(String serverName_, int serverPort_, int timeout_)
serverName_
- サーバー側名前serverPort_
- ポート側のポートtimeout_
- タイムアウトミリ秒(ただし1000ミリ代のみ見る)RuntimeException
- IOException
をcauseとして持つ。public static hiSocket.TCP newSocket(String serverName_, int serverPort_, int timeout_)
hiSocket.TCP _tcp= hiSocket.TCP.newSoket("192.168.1.36",8003,30000); hiSocket.TCP _tcp= new hiSocket.TCP("192.168.1.36",8003,30000);// と同じ
serverName_
- サーバー側名前serverPort_
- ポート側のポートtimeout_
- タイムアウトミリ秒(ただし1000ミリ代のみ見る)RuntimeException
- IOException
をcauseとして持つ。public static hiSocket.TCP newSocket(ServerSocket con_, int timeout_)
サーバ側でソケットのコネクトをします。
int port= 5004; ServerSocket con = new ServerSocket(port); TCP sock= hiSocket.TCP.newSocket(con,60);
con_
- サーバのコネクトポイントtimeout_
- タイムアウト時間(ミリ秒)RuntimeException
- IOException
をcauseとして持つ。public void connect(ServerSocket con_, int timeout_)
サーバ側でソケットのコネクトをします。
int port= 5004; ServerSocket con = new ServerSocket(port); hiBibarySocket sock= new hiSocket.TCP(); sock.connect(con,60);
con_
- サーバのコネクトポイントtimeout_
- タイムアウト時間(ミリ秒)RuntimeException
- IOException
をcauseとして持つ。public void close()
close
インタフェース内 AutoCloseable
public void set_timeout(int timeout_)
soTimeoutをセットします。
次の操作を行います。
socket.setSoTimeout(timeout_);
timeout_
- タイムアウト時間(ミリ秒)RuntimeException
- IOException
をcauseとして持つ。public int read(byte[] b_, int off_, int len_)
指定バッファの指定offset位置以降に指定バイト受信します。
指定バイトになるまでブロックします。
EOFの場合-1を返します。
b_
- バッファoff_
- オフセットlen_
- 長さRuntimeException
- IOException
をcauseとして持つ。public int read()
1バイト読み込みます。EOFに達すると-1を返します。
RuntimeException
- IOException
をcauseとして持つ。public void write(byte[] b_, int off_, int len_)
指定バッファの指定offset位置以降の指定長データを送信します。
autoFlush
がセットされている場合flushします。
b_
- バッファoff_
- オフセットlen_
- 長さRuntimeException
- IOException
をcauseとして持つ。public void write(byte[] b_)
指定バッファの内容を送信します。
autoFlush
がセットされている場合flushします。
b_
- バッファRuntimeException
- IOException
をcauseとして持つ。public void writeNoFlush(byte[] b_, int off_, int len_)
指定バッファの指定offset位置以降の指定長データを送信します。
autoFlush
がセットされている場合でもflushしません。
b_
- バッファoff_
- オフセットlen_
- 長さRuntimeException
- IOException
をcauseとして持つ。public void writeNoFlush(byte[] b_)
指定バッファの内容を送信します。
autoFlush
がセットされている場合でもflushしません。
b_
- バッファRuntimeException
- IOException
をcauseとして持つ。public void write(int b_)
1バイトデータを送信します。
autoFlush
がセットされている場合flushします。
b_
- バイトデータRuntimeException
- IOException
をcauseとして持つ。public void writeNoFlush(int b_)
1バイトデータを送信します。
autoFlush
がセットされている場合でもflushしません。
b_
- バイトデータRuntimeException
- IOException
をcauseとして持つ。public void flush()
RuntimeException
- IOException
をcauseとして持つ。