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

 更新时间:2019年04月02日 15:15:37   作者:毕九生  
这篇文章主要介绍了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编程学习--基于定界符的成帧详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java实现web实时消息推送的七种方案

    java实现web实时消息推送的七种方案

    这篇文章主要为大家介绍了java实现web实时消息推送的七种方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    服务熔断是为了保护我们的服务,比如当某个服务出现问题的时候,控制打向它的流量,让它有时间去恢复,或者限制一段时间只能有固定数量的请求打向这个服务,这篇文章主要介绍了Spring Cloud 使用 Resilience4j 实现服务熔断,需要的朋友可以参考下
    2022-12-12
  • 详解Java中如何使用日志库在代码中添加日志

    详解Java中如何使用日志库在代码中添加日志

    这篇文章主要为大家介绍了Java中如何使用日志库在代码中添加日志详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java设计模式之适配器模式详解

    Java设计模式之适配器模式详解

    这篇文章主要介绍了Java设计模式之适配器模式详解,适配器模式将一个类的接口转换成客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作,需要的朋友可以参考下
    2023-09-09
  • Mybatis查不到数据查询返回Null问题

    Mybatis查不到数据查询返回Null问题

    mybatis突然查不到数据,查询返回的都是Null,但是 select count(*) from xxx查询数量,返回却是正常的。好多朋友遇到这样的问题不知所措,下面小编通过本教程简单给大家说明下
    2016-08-08
  • 零基础学Java:Java开发工具 Eclipse 安装过程创建第一个Java项目及Eclipse的一些基础使用技巧

    零基础学Java:Java开发工具 Eclipse 安装过程创建第一个Java项目及Eclipse的一些基础使用技巧

    这篇文章主要介绍了零基础学Java:Java开发工具 Eclipse 安装过程创建第一个Java项目及Eclipse的一些基础使用技巧,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java整合微信支付功能详细示例

    java整合微信支付功能详细示例

    这篇文章主要给大家介绍了关于java整合微信支付功能的相关资料,支付是一个复杂且测试起来需要的配置特别复杂的模块,文中给出了详细的示例代码,需要的朋友可以参考下
    2023-07-07
  • Java 定时器(Timer,TimerTask)详解及实例代码

    Java 定时器(Timer,TimerTask)详解及实例代码

    这篇文章主要介绍了 Java 定时器(Timer,TimerTask)详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • spring mvc实现文件上传与下载功能

    spring mvc实现文件上传与下载功能

    这篇文章主要为大家详细介绍了spring mvc实现文件上传与下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java二叉树的非递归遍历

    java二叉树的非递归遍历

    二叉树的递归遍历比较简单,这里就不聊了,今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历
    2020-12-12

最新评论