詳解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");
}
}
//將無(wú)定界符的字節(jié)寫(xiě)入消息緩存區(qū)
messageBuffer.write(nextByte);
}
//將消息緩存區(qū)的內(nèi)容以字節(jié)數(shù)組的形式返回
return messageBuffer.toByteArray();
}
}
以上所述是小編給大家介紹的Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(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)文章
java實(shí)現(xiàn)web實(shí)時(shí)消息推送的七種方案
這篇文章主要為大家介紹了java實(shí)現(xiàn)web實(shí)時(shí)消息推送的七種方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法
服務(wù)熔斷是為了保護(hù)我們的服務(wù),比如當(dāng)某個(gè)服務(wù)出現(xiàn)問(wèn)題的時(shí)候,控制打向它的流量,讓它有時(shí)間去恢復(fù),或者限制一段時(shí)間只能有固定數(shù)量的請(qǐng)求打向這個(gè)服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷,需要的朋友可以參考下2022-12-12
Mybatis查不到數(shù)據(jù)查詢返回Null問(wèn)題
mybatis突然查不到數(shù)據(jù),查詢返回的都是Null,但是 select count(*) from xxx查詢數(shù)量,返回卻是正常的。好多朋友遇到這樣的問(wèn)題不知所措,下面小編通過(guò)本教程簡(jiǎn)單給大家說(shuō)明下2016-08-08
Java 定時(shí)器(Timer,TimerTask)詳解及實(shí)例代碼
這篇文章主要介紹了 Java 定時(shí)器(Timer,TimerTask)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
spring mvc實(shí)現(xiàn)文件上傳與下載功能
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)文件上傳與下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12

