é²è¨ï¼å ³äºmesosçå¦ä¹ ï¼å 为æäºåå (æçæ§è½å¥½çå°å¼ææ¶ä¸å¯ç¨äº)èæç½®ï¼æç½®æ¶é´ä¸å®
æè¿å¨å¯¹æ¥æ个第ä¸æ¹çsocketæ¥å£çæ¶åï¼å¯¹ä¸è¿ç§åsocketæå¡å®å ¨ä¸èèç²å æå çæä½å®å ¨ç»æäºï¼æ以åä¸ä¸ç²æµ çå ³äºå¦ä½èªå®ä¹åè®®ï¼ä»¥åç¼åå¯å¤çç²å æå çç¼è§£ç å¨ãå ³äºtcpç²å æå çæ¦å¿µè¯·æ¥é å ¶å®å客
个人认为æ³è½è§£å³æå åç²å é®é¢ï¼æ ¹æ¬çéå¾å°±æ¯ç¥éæ¶æ¯æå¤é¿ã大è´å¸¸ç¨çæ¹æ³å°±æ¯æ¶æ¯ææå®çåé符ï¼æè å¨åé¢åºå®å¤§å°çæ¶æ¯å¤´éåå¨å©ä½æ¶æ¯ä¸»ä½ç大å°
示ä¾å¦ä¸ï¼å®ä¾åºäºnettyç¼åï¼å¤§è´æ³æ³ç¸åï¼ä¸è¿nettyå å»äºèªå·±ç®¡çç¼å
package protocol;
import java.io.UnsupportedEncodingException;
/**
* Created by tangjiaqi on 2018/5/17.
*/
public class Message {
public enum MessageType{
BASE(),
DISCONNECT();
int value;
MessageType(int i) {
value = i;
}
public int getValue(){
return value;
}
public static MessageType valueOf(int i){
MessageType[] types = MessageType.values();
MessageType result = null;
for (MessageType x: types){
if (x.getValue() == i){
result = x;
break;
}
}
return result;
}
}
// å议头ï¼æ è®°åè®®ä»ä»ä¹æ¶åå¼å§
private final static int HEADER = ;
// æ¶æ¯ç±»å
private MessageType messageType;
// å符éçå符串é¿åº¦(èèä¸åç¼ç çæ°æ®)
private int charsetLength;
// å
容é¿åº¦
private int contentLength;
// å
容
private byte[] charset;
// å符é
private byte[] content;
public Message() {
}
public Message(MessageType messageType, String content, String charset) throws UnsupportedEncodingException {
this.messageType = messageType;
this.content = content.getBytes(charset);
this.charset = charset.getBytes();
this.contentLength = this.content.length;
this.charsetLength = this.charset.length;
}
public MessageType getMessageType() {
return messageType;
}
public void setMessageType(MessageType messageType) {
this.messageType = messageType;
}
public int getCharsetLength() {
return charsetLength;
}
public int getContentLength() {
return contentLength;
}
public byte[] getContent() {
return content;
}
public void setContent(String content, String charset) throws UnsupportedEncodingException {
this.content = content.getBytes(charset);
this.charset = charset.getBytes();
this.contentLength = this.content.length;
this.charsetLength = this.charset.length;
}
public byte[] getCharset() {
return charset;
}
public static int getHEADER() {
return HEADER;
}
}
Encoder:
package codce;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import protocol.Message;
/**
* Created by tangjiaqi on 2018/5/17.
*/
public class MyProtocolEncoder extends MessageToByteEncoder<Message> {
public MyProtocolEncoder(){
}
protected void encode(ChannelHandlerContext ctx, Message msg, ByteBuf out) throws Exception {
out.writeInt(msg.getHEADER());
out.writeInt(msg.getMessageType().getValue());
out.writeInt(msg.getCharsetLength());
out.writeInt(msg.getContentLength());
out.writeBytes(msg.getCharset());
out.writeBytes(msg.getContent());
}
}
encoderè¾ä¸ºç®åï¼æ顺åºåå ¥ByteBuf就好äº
Decoder:
package codce;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import protocol.Message;
import protocol.Message.MessageType;
import java.util.List;
/**
* Created by tangjiaqi on 2018/5/17.
*/
public class MyProtocolDecoder extends ByteToMessageDecoder {
public MyProtocolDecoder(){
}
// å议头+æ¶æ¯ç±»å+charsetLength+contentLengthçé¿åº¦
private final static int BASE_LENGTH = ;
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
System.out.println("start decode");
int beginIndex = in.readerIndex();
int messageTypeValue = , charsetLength = , contentLength = ;
boolean flag = false;
while (in.readableBytes() > BASE_LENGTH){
beginIndex = in.readerIndex();
int tmp = in.readInt();
// åè®®å¼å§
if (tmp == Message.getHEADER()){
messageTypeValue = in.readInt();
charsetLength = in.readInt();
contentLength = in.readInt();
flag = true;
break;
}
}
if (!flag){
return;
}else {
// å©ä½å¯è¯»æ°æ®å°äºæéï¼è¿åçå¾
ä¸æ¬¡æ°æ®çå°æ¥
if (in.readableBytes() < (charsetLength + contentLength)){
// è®°ä½å°è¯»ç´¢å¼å½ä½
in.readerIndex(beginIndex);
return;
}else {
byte[] charset = new byte[charsetLength];
byte[] content = new byte[contentLength];
in.readBytes(charset);
in.readBytes(content);
String charsetStr = new String(charset);
String contentStr = new String(content, charsetStr);
Message message = new Message(MessageType.valueOf(messageTypeValue), contentStr, charsetStr);
out.add(message);
}
}
System.out.println("end decode");
}
}
å ³äºè§£ç å¨é¨åå ¶å®å°±å 个注æç¹
- é¦å è¦è¯»åå°ä½ èªå®ä¹çå 头çå¼å§å段
- ä¸æ¬¡æ§è¯»åä½ å®ä¹çåºå®é¿åº¦ç头ï¼ä»èè½ä»å¤´ä¸è·åå°å©ä½å段ç大å°
è¾¾æ以ä¸ä¸¤ç¹å¤§è´å°±è½åå°è§£å³æå ç²å é®é¢äºï¼å ³äºè¿ä¸ªåè®®è¿åäºä¸ä¸ªæµè¯ï¼æµè¯å¤§è´å°±æ¯ä¸æ¬¡æ§ä¼ è¾å 容è¾å¤§ï¼ç¶åæ¥çæ¥åå°çå 容以å解ç è¿ç¨
å ³äºå¯¹è¿ä¸ªèªå®ä¹åè®®çdemoåºç¨è¯¦è§: https://github.com/ncuwaln/protocol-demo
ps: è¿ä¸ªèªå®ä¹å议没æèèä»»ä½ä¼ è¾å 容çåå°çä¼å以åå ¶å®ä¸ä¸å «å «çåç§ç»èï¼å¾ç®åçé£ç§