私の Java アプリケーションでは、開いているソケットがあり、データはその InputStream から読み取られています。
最適な条件では、入ってくる各パケットは read() への呼び出しとなり、そのアプリケーション層データを返します。これは私が取得しようとしているものです-パケットごとに1つの「メッセージ」 。
ただし、 getReceiveBufferSize() が返すものに基づいて、データがソケットにバッファリングされる可能性があります。これが発生し、ストリームが読み取られる場合、そこに複数のパケットからのデータが存在する可能性があります。
個々のパケットからデータを取得する別の方法はありますか、それとも抽象化のレイヤーに違反していますか? または、データがバッファに追加されるときに何らかの区切り文字を設定することは可能ですか? それとも、プラットフォーム レベルで実行できないことですか?
私がやっていることを示すためのコード例を次に示します。
import java.io.InputStream;
import java.net.Socket;
public class Belnets {
public Belnets() {
try{
Socket s = new Socket("address", 23);
System.out.println("platform will buffer this much: "+s.getReceiveBufferSize());
InputStream sin = s.getInputStream();
byte[] data = new byte[1024];
int c;
while(true){
c = sin.read(data);
for(int i=0; i<c; i++){
System.out.print((char)data[i]);
}
System.out.println("=END OF READ=");
//if you dont do this, read() seems to return once for each packet as this loop
//appears to be running fast enough to keep up with the rate of data that comes in.
//otherwise data gets buffered and you get multiple packets worth of data before seeing
//=END OF READ=
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
new Belnets();
}
}