一罚缕、簡(jiǎn)介
- 1峭咒、協(xié)議格式 : 采用二進(jìn)制格式鳍咱,【協(xié)議標(biāo)識(shí)】【正文長(zhǎng)度】【正文內(nèi)容】
協(xié)議標(biāo)識(shí):1個(gè)字節(jié)
內(nèi)容長(zhǎng)度:4個(gè)字節(jié) (存放正文內(nèi)容的長(zhǎng)度int)
正文內(nèi)容:可變長(zhǎng)度
二荣刑、代碼實(shí)現(xiàn)
public class TCPClient {
public static void main(String[] args) throws Exception {
TCPClient client = new TCPClient();
client.sendAndReceive();
}
private void sendAndReceive() throws Exception {
Socket client = new Socket("127.0.0.1", 1234);
OutputStream out = client.getOutputStream();
int i = 0;
while (true){
byte head =0x1A ;
String data = "test"+ (int)(Math.random()*1000);
out.write(head); //寫頭
int len = data.getBytes().length;
byte[] bytLen = BytesUtil.int2Bytes(len);
out.write(bytLen); //長(zhǎng)度
out.flush();
Thread.sleep(2*1000);
out.write(data.getBytes());
System.out.println(++i + "=====================發(fā)送結(jié)束绒极!"+head+len+data);
}
}
}
- 2 服務(wù)端處理粘包骏令、半包問題 。半包問題垄提,由于vertx自帶緩存不需要關(guān)注榔袋,只關(guān)注粘包問題即可
@Slf4j
public class WorkerVerticleTcp extends AbstractVerticle {
String workerName = null;
@Override
public void start() throws Exception {
// 創(chuàng)建TCP Server
int len_header = 1+4 ; // 1個(gè)字節(jié)類型,4個(gè)字節(jié)長(zhǎng)度
NetServer server = vertx.createNetServer();
// 設(shè)置Handler
server.connectHandler(socket -> {
// 構(gòu)造parser
RecordParser parser = RecordParser.newFixed(len_header);
parser.setOutput(new Handler<Buffer>() {
int size = -1;
@Override
public void handle(Buffer buffer) {
System.out.println("收到數(shù)據(jù)"+buffer.toString());
//找到頭
if (-1 == size) {
byte head = buffer.getByte(0); //第一個(gè)字節(jié)0x1A
if(head != 0x1A){
System.out.println("----ignore----->"+head);
return; //頭铡俐,忽略
}
byte h0 = buffer.getByte(0); //第1個(gè)字節(jié)是類型0x1A
size = buffer.getInt(1); // 從第2~3個(gè)字節(jié)是長(zhǎng)度
parser.fixedSizeMode(size);
System.out.println(buffer.toString());
} else {
byte[] buf = buffer.getBytes();
try {
String str = new String(buf);
System.out.println(str);
} catch (Exception e) {
return;
}
parser.fixedSizeMode(len_header);
size = -1;
}//end if-else
}
});
socket.handler(parser);
});
// 監(jiān)聽
server.listen(1234, "127.0.0.1", res -> {
if (res.succeeded()) {
System.out.println("tcp server is listening at 1234 ");
} else {
System.out.println(res.cause());
}
});
}
}
@Slf4j
public class TcpServerDemo extends AbstractVerticle {
String proptiestPath = null;
public static void main(String[] args) {
Runner.runExample(TcpServerDemo.class);
}
@Override
public void start() {
vertx.deployVerticle(WorkerVerticleTcp.class,new
DeploymentOptions().setWorker(true).setInstances(1));
//websocket
}
}