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

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

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

 
一.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
Netty Quic是一种基于QUIC(Quick UDP Internet Connections)协议的高性能、低延迟的网络通信框架,它是由Netty项目集成支持的。QUIC是一种由Google设计并维护的下一代传输层协议,旨在改进TCP/IP协议栈的性能,特别是在移动网络环境下。 在Netty中实现Quic服务器和客户端通信,可以按照以下步骤操作: 1. **添加依赖**:在你的项目中引入Netty的Quic模块,例如如果你使用Maven,需要添加`io.netty:netty-quic`依赖。 2. **创建QuicServer**:服务器端需要创建一个`QuicServerBootstrap`实例,并配置监听地址和处理器链路。 ```java QuicServerBootstrap bootstrap = new QuicServerBootstrap(); bootstrap.group(...); // 设置事件组 bootstrap.channel(NioQuicServerChannel.class); bootstrap.childOption(ChannelOption.AUTO_READ, false); // 配置选项 bootstrap.childHandler(new MyQuicServerHandler()); // 自定义处理程序 bootstrap.bind(...); // 绑定端口 ``` 3. **创建QuicClient**:客户端则需要创建一个`QuicClientBootstrap`实例,设置目标地址,并连接到服务器。 ```java QuicClientBootstrap clientBootstrap = new QuicClientBootstrap(); clientBootstrap.group(...); // 设置事件组 clientBootstrap.channel(NioQuicClientChannel.class); clientBootstrap.handler(new MyQuicClientHandler()); QuicOptions options = new QuicOptions(); // 设置连接选项 options.maxIdleTimeMillis(5000); // 设置最大空闲时间 clientBootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, options.connectTimeoutMillis); clientBootstrap.connect(...); // 连接服务器地址 ``` 4. **自定义Handler**:`MyQuicServerHandler`和`MyQuicClientHandler`是你自己实现的,用于处理数据收发、连接管理和错误处理等任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值