详解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编程学习--基于定界符的成帧详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Java实现Socket的TCP传输实例

    本文实例讲述了Java实现Socket的TCP传输.分享给大家供大家参考.具体分析如下: 客户端发数据到服务端 * Tcp传输,客户端建立的过程. * 1,创建tcp客户端socket服务.使用的是Socket对象. * 建议该对象一创建就明确目的地.要连接的主机. * 2,如果连接建立成功,说明数据传输通道已建立. * 该通道就是socket流 ,是底层建立好的. 既然是流,说明这里既有输入,又有输出. * 想要输入或者输出流对象,可以找Socket来获取. * 可以通过getOutputSt

  • Java基于Tcp/ip连接的多人交互聊天室

    本文实例为大家分享了Java  Socket编程实现多人交互聊天室的具体代码,供大家参考,具体内容如下 本项目由三个.java文件(Client.java.Server.java.UI.java)和一个.jpg图片文件组成UI.java是负责界面的构成文件.本聊天室的界面极其简单.主要分为两个界面:第一个是启动时需要登陆的界面如下: 输入名字进去以后就可以直接聊天     这个聊天室相当于群聊,每一个登陆进去的人发的信息,其他人都会收到. 使用指南: 1.运行Server.java文件,保证服务

  • Java基于Socket实现网络编程实例详解

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

  • TCP/IP协议中三次握手四次挥手的原理及流程分析

    当初学的是通信专业,毕业以后,同学们各奔东西,去追逐自己的梦想,奔波于大大小小的工地之间.哈哈,开个玩笑,也有厉害的,进了某某研究所,嗯?他爸不是所长,内心不要太阴暗.记得有一门十分高大上的课程,名字叫做计算机网络(大概是这个名字吧).里面有一个关于握手的概念,现在温习一下. 先来看看原理图: TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列

  • 详解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

  • 详解Java网络编程

    一.网络编程 1.1.概述 1.计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程. 2.Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. 3.Java提供的网络类库,可以实现无痛的网络连接,联

  • 详解Java如何通过Socket实现查询IP

    目录 背景 使用示例 应用例子 应用服务器 获取客户端的IP地址 向客户端发送消息 测试应用程序 建立一个客户端应用程序 运行应用程序 在后台发生了什么 总结 在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址.我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API. 背景 Java应用程序使用套接字在互联网上进行通信和发送数据.Java为客户端应用程序提供了java.net.Socket类. java.net.ServerSocket类

  • 详解Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于某种语法或调用API去进行编程.例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: public static void main(String[] args) { int[] nums = new int[]{1, 2, 3, 4, 5,

  • 详解Java事件编程的使用

    Java事件编程 当前在线网店很多,很涉及商品管理和销售的问题,比如: 一,在商品库存管理的商品增加时,我们主要业务时编辑保持商品信息, 同时因商品增加而附带有一些"非主要业务",如: 1,应商品的库存数量等更新, 2,热销产品的推广处理等 二,在商品产生订单时,我们的主要业务(对买家而言)是建立订单业务, 同时因产生订单而附带有一些不是买家关心的"非主要业务",如: 1,库存和已售数量的更新 2,发货的准备处理事宜 3,物流的处理事宜 非主要业务我们可以让程序使用

  • 详解Java分布式IP限流和防止恶意IP攻击方案

    前言 限流是分布式系统设计中经常提到的概念,在某些要求不严格的场景下,使用Guava RateLimiter就可以满足.但是Guava RateLimiter只能应用于单进程,多进程间协同控制便无能为力.本文介绍一种简单的处理方式,用于分布式环境下接口调用频次管控. 如何防止恶意IP攻击某些暴露的接口呢(比如某些场景下短信验证码服务)?本文介绍一种本地缓存和分布式缓存集成方式判断远程IP是否为恶意调用接口的IP. 分布式IP限流 思路是使用redis incr命令,完成一段时间内接口请求次数的统

  • 详解JAVA 函数式编程

    1.函数式接口 1.1概念: java中有且只有一个抽象方法的接口. 1.2格式: 修饰符 interface 接口名称 { public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容 } //或者 public interface MyFunctionalInterface { void myMethod(); } 1.3@FunctionalInterface注解: 与 @Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解

  • 详解Java Web如何限制访问的IP的两种方法

    前一阵子因为在做项目时碰到了这个功能,现在好好总结一下,至于为什么要限制IP访问,我就不多说了.然后百度了一下,现在主要有两种方式去限制IP访问,第一种是最简单的方便的,第二种是通过过滤器来限制访问.下面我简单介绍一下第一种方式,着重介绍第二种. 第一种方式(Tomcat配置项配置允许或限制IP访问) 这种是最简单的快捷的,主要就涉及Tomcat的server.xml配置. 第一步:找到server.xml文件在哪,在Tomcat的目录下的conf文件夹下. 第二步:打开server.xml文件

  • 详解Java字节码编程之非常好用的javassist

    一.Javassist入门 (一)Javassist是什么 Javassist是可以动态编辑Java字节码的类库.它可以在Java程序运行时定义一个新的类,并加载到JVM中:还可以在JVM加载时修改一个类文件.Javassist使用户不必关心字节码相关的规范也是可以编辑类文件的. (二)Javassist核心API 在Javassist中每个需要编辑的class都对应一个CtCLass实例,CtClass的含义是编译时的类(compile time class),这些类会存储在Class Poo

  • 详解Java并发编程基础之volatile

    目录 一.volatile的定义和实现原理 1.Java并发模型采用的方式 2.volatile的定义 3.volatile的底层实现原理 二.volatile的内存语义 1.volatile的特性 2.volatile写-读建立的happens-before关系 3.volatile的写/读内存语义 三.volatile内存语义的实现 1.volatile重排序规则 2.内存屏障 3.内存屏障示例 四.volatile与死循环问题 五.volatile对于复合操作非原子性问题 一.volati

随机推荐