软件编程
位置:首页>> 软件编程>> java编程>> 详解Java的TCP/IP编程学习--基于定界符的成帧

详解Java的TCP/IP编程学习--基于定界符的成帧

作者:毕九生  发布时间:2023-11-23 03:02:32 

标签:Java,TCP/IP,成帧

一、定界符成帧

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='\n';
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();
 }
}

以上所述是小编给大家介绍的Java的TCP/IP编程学习--基于定界符的成帧详解整合,希望对大家有所帮助.

来源:https://blog.csdn.net/qq_39400984/article/details/88697835

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com