Netty Http协议栈开发(客户端&服务端)

本文探讨了如何使用Netty构建HTTP协议栈,涵盖了客户端和服务端的实现细节,揭示了网络通信中从高层协议到低层协议的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协议栈 是指网络中各层协议的总和, 反应了一个网络中文件传输的过程: 由上层协议到底层协议,再由底层协议到上层协议.

 
一.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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值