前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络|Netty|NIO

网络|Netty|NIO

作者头像
heidsoft
发布2022-08-31 11:21:20
3500
发布2022-08-31 11:21:20
举报

http 服务端

代码语言:javascript
复制
 * An HTTP server that sends back the content of the received HTTP request
 * in a pretty plaintext form.
 */
public final class HttpHelloWorldServer {

    static final boolean SSL = System.getProperty("ssl") != null;
    static final int PORT = Integer.parseInt(System.getProperty("port", SSL? "8443" : "8080"));

    public static void main(String[] args) throws Exception {
        // Configure SSL.
        final SslContext sslCtx;
        if (SSL) {
            SelfSignedCertificate ssc = new SelfSignedCertificate();
            sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
        } else {
            sslCtx = null;
        }

        // Configure the server.
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.option(ChannelOption.SO_BACKLOG, 1024);
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new HttpHelloWorldServerInitializer(sslCtx));

            Channel ch = b.bind(PORT).sync().channel();

            System.err.println("Open your web browser and navigate to " +
                    (SSL? "https" : "http") + "://127.0.0.1:" + PORT + '/');

            ch.closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
代码语言:javascript
复制
   /**
     * If {@code true} then the {@link Channel} is closed automatically and immediately on write failure.
     * The default value is {@code true}.
     */
    public static final ChannelOption<Boolean> AUTO_CLOSE = valueOf("AUTO_CLOSE");

    public static final ChannelOption<Boolean> SO_BROADCAST = valueOf("SO_BROADCAST");
    public static final ChannelOption<Boolean> SO_KEEPALIVE = valueOf("SO_KEEPALIVE");
    public static final ChannelOption<Integer> SO_SNDBUF = valueOf("SO_SNDBUF");
    public static final ChannelOption<Integer> SO_RCVBUF = valueOf("SO_RCVBUF");
    public static final ChannelOption<Boolean> SO_REUSEADDR = valueOf("SO_REUSEADDR");
    public static final ChannelOption<Integer> SO_LINGER = valueOf("SO_LINGER");
    public static final ChannelOption<Integer> SO_BACKLOG = valueOf("SO_BACKLOG");
    public static final ChannelOption<Integer> SO_TIMEOUT = valueOf("SO_TIMEOUT");

    public static final ChannelOption<Integer> IP_TOS = valueOf("IP_TOS");
    public static final ChannelOption<InetAddress> IP_MULTICAST_ADDR = valueOf("IP_MULTICAST_ADDR");
    public static final ChannelOption<NetworkInterface> IP_MULTICAST_IF = valueOf("IP_MULTICAST_IF");
    public static final ChannelOption<Integer> IP_MULTICAST_TTL = valueOf("IP_MULTICAST_TTL");
    public static final ChannelOption<Boolean> IP_MULTICAST_LOOP_DISABLED = valueOf("IP_MULTICAST_LOOP_DISABLED");

    public static final ChannelOption<Boolean> TCP_NODELAY = valueOf("TCP_NODELAY");
代码语言:javascript
复制
public class HttpHelloWorldServerHandler extends SimpleChannelInboundHandler<HttpObject> {              
    private static final byte[] CONTENT = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };    
                                                                                                        
    @Override                                                                                           
    public void channelReadComplete(ChannelHandlerContext ctx) {                                        
        ctx.flush();                                                                                    
    }                                                                                                   
                                                                                                        
    @Override                                                                                           
    public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) {                               
        if (msg instanceof HttpRequest) {                                                               
            HttpRequest req = (HttpRequest) msg;                                                        
                                                                                                        
            boolean keepAlive = HttpUtil.isKeepAlive(req);                                              
            FullHttpResponse response = new DefaultFullHttpResponse(req.protocolVersion(), OK,          
                                                                    Unpooled.wrappedBuffer(CONTENT));   
            response.headers()                                                                          
                    .set(CONTENT_TYPE, TEXT_PLAIN)                                                      
                    .setInt(CONTENT_LENGTH, response.content().readableBytes());                        
                                                                                                        
            if (keepAlive) {                                                                            
                if (!req.protocolVersion().isKeepAliveDefault()) {                                      
                    response.headers().set(CONNECTION, KEEP_ALIVE);                                     
                }                                                                                       
            } else {                                                                                    
                // Tell the client we're going to close the connection.                                 
                response.headers().set(CONNECTION, CLOSE);                                              
            }                                                                                           
                                                                                                        
            ChannelFuture f = ctx.write(response);                                                      
                                                                                                        
            if (!keepAlive) {                                                                           
                f.addListener(ChannelFutureListener.CLOSE);                                             
            }                                                                                           
        }                                                                                               
    }                                                                                                   
                                                                                                        
    @Override                                                                                           
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {                           
        cause.printStackTrace();                                                                        
        ctx.close();                                                                                    
    }                                                                                                   
}                                                                                                       
                                                                                                        

https://linux.die.net/man/2/listen

backlog 参数定义了 sockfd 的挂起连接队列可能增长到的最大长度。如果连接请求在队列已满时到达,则客户端可能会收到指示 ECONNREFUSED 的错误,或者,如果基础协议支持重新传输,则可能会忽略该请求,以便以后的重新尝试连接成功。

https://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html

https://blog.csdn.net/weixin_44730681/article/details/113728895

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云数智圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档