Java的TCP/IP编程学习--基于长度的成帧
2019-03-20 19:53
246 查看
基于长度的成帧
package framer; import java.io.*; /** * @ClassName LengthFramer * @Description TODO * LengthFramer.java类实现了基于长度的成帧方法,适用于长度小于65535(216-1) * 字节的消息。发送者首先给出指定消息的长度,并将长度信息以b1g-endian顺序存入两 * 个字节的整数中,再将这两个字节放在完整的消息内容前,连同消息一起写入输出流。 * 在接收端,我们使用DatalnputStream以读取整型的长度信息;readFully()方法将阻塞 * 等待,直到给定的数组完全填满,这正是我们需要的。值得注意的是,使用这种成帧方 * 法,发送者不需要检查要成帧的消息内容,而只需要检查消息的长度是否超出了限制。 * @Author Cays * @Date 2019/3/17 8:45 * @Version 1.0 **/ public class LengthFramer implements Framer{ public static final int MAXMESSAGELENGTH = 65535; public static final int BYTEMASK = 0xff; public static final int SHORTMASK = 0xffff; public static final int BYTESHIFT=8; private DataInputStream in; /** * 获取赖消息源的输入流,并将其包裹在一个DataInputStream * @param in * @throws IOException */ public LengthFramer(InputStream in) throws IOException{ this.in = new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if (message.length>MAXMESSAGELENGTH){ throw new IOException("message too long"); } /** * 由于我们用的是长为两个字节的字段,因此消息的长度不能超过65535。 * (注意该值太大而不能存入一个short型整数中, * 因此我们每次只向输出流写一个字节) */ out.write((message.length>>BYTESHIFT)&BYTEMASK); out.write(message.length&BYTEMASK); out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try { //readUnsignedShort()方法读取两个字节, // 将它们作为big-endian整数进行解释,并 //以int型整数返回它们的值。 length = in.readUnsignedShort(); }catch (EOFException e){ return null; } byte[] msg=new byte[length]; //阻塞等待,直到接收到足够的字节来填满指定的字节数组 in.readFully(msg); return msg; } }25cb9
相关文章推荐
- Java的TCP/IP编程学习--构建和解析协议消息
- Java TCP/IP Socket 编程学习笔记系列 +数据结构
- JAVA基础 day25 网络编程 IP类 UDP,TCP传输学习 简易聊天工具 TCP并发学习
- Java 基于Tcp/ip连接的多人交互聊天室(Socket编程)
- Java网络编程基础(二)-- 基于TCP/IP的Socket编程
- Java 网络编程--------------------基于TCP/IP(加入多线程)
- 19. JAVA 网络编程 Part 1 (IP与InetAddress类、URL与URLConnection类、URLEncoder与URLDecoder类、TCP&UDP)---- 学习笔记
- Java学习之网路编程--TCP/IP
- java网络编程自学(三)-TCP/IP+NIO
- Java的网络编程(TCP/IP)
- 孙鑫VC学习(第14课网络编程,TCP/IP,UDP)
- [原]《Java TCP/IP Socket 编程 》读书笔记之十二:各章节要点
- Java学习13--TCP网络编程
- [学习笔记]Java网络编程之TCP通讯
- java学习之路——基于TCP的Socket网络通信实例
- 基于TCP/IP的文件服务器编程一例
- java网络编程 tcp 黑马程序员学习笔记(11)
- TCP/IP网络编程 学习笔记_1 --网络编程入门
- JAVA TCP/IP Socket 编程(一)
- Java基于TCP/IP的Socket通信