协议栈 是指网络中各层协议的总和, 反应了一个网络中文件传输的过程: 由上层协议到底层协议,再由底层协议到上层协议.
一.Netty Http+Json 协议栈开发
1. 构造请求信息,编码为http+json
Netty的http协议栈提供了构造http请求消息的相关接口
2. 客户端发起http请求
3. 服务端对客户端的请求进行解码成Javabean
4. 服务端构造应答消息并编码,通过http+json返回给客户端
5. 客户端对响应的消息解码成Javabean
HttpJsonRequestEncoder: 请求消息编码类
1.首先调用父类的encode(),将HttpJsonRequest通过序列化成xml字符串,然后封装成netty的byteBuf
2.判断,如果业务侧自定义和定制了消息头,则使用业务侧设置的http消息头,如果没有,则构造新的http消息头
3.构造和设置默认的http消息头
4.由于请求消息消息体不为空,也没有使用chunk方式,所以在http消息头中设置消息体的长度,然后加入out中
package com.tomorrow_p.netty5_http_file_p.LAN.http;
import android.util.Log;
import java.net.InetAddress;
import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpVersion;
public class HttpJsonRequestEncoder extends AbsHttpJsonEncoder<HttpJsonRequest> {
@Override
protected void encode(ChannelHandlerContext ctx, HttpJsonRequest message, List<Object> out) throws Exception {
Log.d("Encode", "HttpJsonRequestEncoder");
ByteBuf body = encode(ctx, message.getBody());
FullHttpRequest request = message.getRequest();
if (request == null) {
request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/do", body);
HttpHeaders headers = request.headers();
headers.set(HttpHeaders.Names.HOST, InetAddress.getLocalHost().getHostAddress());
headers.set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
headers.set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP.toString() + "," + HttpHeaders.Values.DEFLATE.toString());
}
HttpHeaders.setContentLength(request, body.readableBytes());
out.add(request);
}
}
AbstractHttpJsonEncoder: 父类
完成http请求消息的编码
package com.tomorrow_p.netty5_http_file_p.LAN.http;
import android.util.Log;
import com.google.gson.Gson;
import java.nio.charset.Charset;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
public abstract class AbsHttpJsonEncode