您好,登錄后才能下訂單哦!
一、定界符成幀
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編程學習--基于定界符的成幀詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。