JavaのTCP/IPプログラミング学習--デリミタベースのフレーム化
9514 ワード
一、境界符号フレーム
Framerインタフェース
デリミタベースのフレーム化
Framerインタフェース
package framer;
import java.io.IOException;
import java.io.OutputStream;
public interface Framer {
/**
*
* @param message
* @param out
* @throws IOException
*/
void frameMsg(byte[] message, OutputStream out) throws IOException;
/**
* ,
* @return
* @throws IOException
*/
byte[] nextMsg() throws IOException;
}
デリミタベースのフレーム化
package framer;
import java.io.*;
/**
* @ClassName DelimFramer
* @Description TODO
* @Author Cays
* @Date 2019/3/16 22:04
* @Version 1.0
**/
public class DelimFramer implements Framer {
//
private InputStream in;
//
private static final byte DELIMITER='
';
public DelimFramer(InputStream in) {
this.in = in;
}
@Override
public void frameMsg(byte[] message, OutputStream out) throws IOException {
//
for (byte b:message){
if (b==DELIMITER){
throw new IOException("Message contaions delimiter");
}
}
//
out.write(message);
//
out.write(DELIMITER);
out.flush();
}
@Override
public byte[] nextMsg() throws IOException {
ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream();
int nextByte;
// ,
while ((nextByte=in.read())!=DELIMITER){
if (nextByte==-1){
//
if (messageBuffer.size()==0){
return null;
}else {
// ,
throw new EOFException("Non-empty message without delimiter");
}
}
//
messageBuffer.write(nextByte);
}
//
return messageBuffer.toByteArray();
}
}