詳解Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀
一、定界符成幀
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 { //檢測(cè)信息中是否包含換行符 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; //讀取流中的每一個(gè)字節(jié),直到遇到定界符 while ((nextByte=in.read())!=DELIMITER){ if (nextByte==-1){ //如果遇到定界符之前就到了流的終點(diǎn) if (messageBuffer.size()==0){ return null; }else { //如果存入緩存區(qū)之前有數(shù)據(jù),拋出異常 throw new EOFException("Non-empty message without delimiter"); } } //將無定界符的字節(jié)寫入消息緩存區(qū) messageBuffer.write(nextByte); } //將消息緩存區(qū)的內(nèi)容以字節(jié)數(shù)組的形式返回 return messageBuffer.toByteArray(); } }
以上所述是小編給大家介紹的Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Java基于Tcp/ip連接的多人交互聊天室
- tcp、udp、ip協(xié)議分析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- java實(shí)現(xiàn)微信App支付服務(wù)端
- Java基于socket實(shí)現(xiàn)的客戶端和服務(wù)端通信功能完整實(shí)例
- 微信小程序調(diào)用微信登陸獲取openid及java做為服務(wù)端示例
- Java編程Socket實(shí)現(xiàn)多個(gè)客戶端連接同一個(gè)服務(wù)端代碼
- java服務(wù)端微信APP支付接口詳解
- Java實(shí)現(xiàn)TCP/IP協(xié)議的收發(fā)數(shù)據(jù)(服務(wù)端)代碼實(shí)例
相關(guān)文章
SpringBoot Redisson 集成的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot Redisson 集成的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Spring AOP實(shí)現(xiàn)功能權(quán)限校驗(yàn)功能的示例代碼
本篇文章主要介紹了Spring AOP實(shí)現(xiàn)功能權(quán)限校驗(yàn)功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12計(jì)算機(jī)二級(jí)考試java軟件操作教程 教大家如何學(xué)習(xí)java
如何成為一名知識(shí)豐富的Java程序員,順利通過計(jì)算機(jī)二級(jí)Java考試,這篇文章主要主要教大家如何學(xué)習(xí)java,java的學(xué)習(xí)路線是什么,從何學(xué)起,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08JPA添加Pageable實(shí)現(xiàn)翻頁(yè)時(shí)報(bào)錯(cuò)的問題
這篇文章主要介紹了解決JPA添加Pageable實(shí)現(xiàn)翻頁(yè)時(shí)報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和
這篇文章主要給大家介紹了關(guān)于java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和的相關(guān)資料,Stream是Java8的一大亮點(diǎn),是對(duì)容器對(duì)象功能的增強(qiáng),它專注于對(duì)容器對(duì)象進(jìn)行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作,需要的朋友可以參考下2023-12-12Maven在Java8下如何忽略Javadoc的編譯錯(cuò)誤詳解
這篇文章主要給大家介紹了關(guān)于Maven在Java8下如何忽略Javadoc的編譯錯(cuò)誤的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Java實(shí)現(xiàn)最小生成樹MST的兩種解法
最小生成樹(MST)指在連通圖的所有生成樹中,所有邊的權(quán)值和最小的生成樹。本文介紹了求最小生成樹的兩種方法:Prim算法和Kruskal算法,需要的可以參考一下2022-05-05EasyExcel實(shí)現(xiàn)導(dǎo)入+各種數(shù)據(jù)校驗(yàn)功能
這篇文章主要介紹了EasyExcel實(shí)現(xiàn)導(dǎo)入+各種數(shù)據(jù)校驗(yàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Java整型數(shù)與網(wǎng)絡(luò)字節(jié)序byte[]數(shù)組轉(zhuǎn)換關(guān)系詳解
這篇文章主要介紹了Java整型數(shù)與網(wǎng)絡(luò)字節(jié)序byte[]數(shù)組轉(zhuǎn)換關(guān)系,結(jié)合實(shí)例形式歸納整理了java整型數(shù)和網(wǎng)絡(luò)字節(jié)序的byte[]之間轉(zhuǎn)換的各種情況,需要的朋友可以參考下2017-08-08