Netty之基于Http协议通信(HelloWorld&文件服务器)

稳定性性能系列之十五——系统稳定性监控体系建设:从指标到预警的完整方案 深入探讨Android系统稳定性监控体系的设计与实现,涵盖指标体系设计、数据采集方案、异常检测算法、预警响应机制,并提供完整的监控平台搭建实践。 阅读详情

1、简单介绍HTTP协议:

        Http协议即超文本传输协议,是建立在TCP传输协议之上的应用层协议,他目前主流是针对WEB开发,HTTP协议应用非常广泛,因此掌握HTTP协议的开发非常之重要。我们主要讲解Netty如何基于HTTP协议进行开发,那么使用Netty的HTTP协议也是异步非阻塞的。

2、HTTP协议的特点:

        简单:客户端请求服务器时主需要指定URL和携带必要的参数即可。

        灵活:HTTP协议允许传输任意类型的数据类型,传输内容由HTTP消息头中的Content-Type加以标记。

        无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理客户的请求,并受到客户端的应答后,就断开连接。采用这种方式可以节省传输时间。

        无状态:HTTP协议是无状态的,无状态指的是协议对事务处理没有记忆能力。这意味着如果后续处理需要之前的信息,则它必须重新获取。也从侧面体现了HTTP的设计是为了使网络传输更加的轻量级、敏捷、负载较轻。

3、HTTP协议的组成部分:

     请求行:用来说明请求类型,要访问的资源以及所使用的HTTP版本。

     请求头:紧接着请求行(第一行)之后的部分,用来说明服务器要使用的附加信息。

     空行:请求头部后面的空行是必须的。即使第四部分的请求正文是空的也必须要有空行。

      请求正文(实体内容):可以添加任意的其他数据。

4、HTTP协议的请求方式:

       GET:获取Reqeust-URI所标识的资源

       POST:在Request-URI所标识的资源附加新的提交数据

       HEAD:请求获取由Request-URI所标识的资源的响应消息头

       PUT:请求服务器存储一个资源,并用Request_URI作为一个标识

       DELETE:请求服务器删除Request-URI所标识的资源

        TRACE:请求服务器回送收到的请求信息,主要是测试和诊断使用(@trace)

        CONNECT:保留将来使用

        OPTIONS:请求查询服务器的性能

5、HTTP协议的响应消息

      响应消息由三部分组成:状态行、消息头、响应正文。

      响应状态的种类:

             1xx:提示消息。表示请求已经接收继续处理。

             2xx:成功。表示请求已经接收成功。

             3xx:重定向。要完成的请求必须进行更一步的操作。

             4xx:客户端错误。可能是请求语法错误或者请求无法实现。

             5xx:服务端错误。服务器未能处理请求(可能内部出现异常)。

      常用相应状态码:

             200 OK:成功。

             400 Bad Request :错误的请求语法,不能被服务器理解。

             401 Unauthorized:请求未经授权。

             403 Forbidden:服务器收到请求,但请求被服务器拒绝。

             404 Not Found:请求资源不存在。

             405 Method Not Allowed:请求方式不被允许,如只支持get请求,但客户端使用了post请求。

             500 Inernal Server Error:服务器发生不可预测的错误。

             503 Server Unavailable:服务器当前不能处理客户端请求,一段时间后可能恢复正常

 

Netty关于HTTP的例子都是从官网上面拿的。首先是Hello World,然后是文件服务器(上传和下载)。

服务器Server:

package com.demo.testNetty.http;

import java.security.cert.CertificateException;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.util.SelfSignedCertificate;

public 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 {
		
		// 配置 SSL.
        final SslContext sslCtx;
        if (SSL) {
            SelfSignedCertificate ssc = new SelfSignedCertificate();
            sslCtx = SslContext.newServerContext(ssc.certificate(), ssc.privateKey());
        } else {
            sslCtx = null;
        }
        
		//配置服务器
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		EventLoopGroup workGroup = new NioEventLoopGroup();
		try{
			ServerBootstrap sb = new ServerBootstrap();
			
			sb.group(bossGroup, workGroup)
			.channel(NioServerSocketChannel.class)
			.option(ChannelOption.SO_BACKLOG, 1024)
			.handler(new LoggingHandler(LogLevel.INFO))
			//需要将SSL带到初始化那
			.childHandler(new HttpHelloWorldServerInitializer(sslCtx));
			
			//绑定端口PORT
			ChannelFuture ch = sb.bind(PORT).sync();
			System.err.println("Open your web browser and navigate to " +
	                (SSL? "https" : "http") + "://127.0.0.1:" + PORT + '/');
			ch.channel().closeFuture().sync();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			bossGroup.shutdownGracefully();
			workGroup.shutdownGracefully();
		}
		
	}
}

服务器Initializer:

package com.demo.testNetty.http;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.ssl.SslContext;

public class HttpHelloWorldServerInitializer extends ChannelInitializer<SocketChannel>{

	private final SslContext sslCtx;
	  
    public HttpHelloWorldServerInitializer(SslContext sslCtx) {
         this.sslCtx = sslCtx;
      }
    
	@Override
	protected void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline p = ch.pipeline();
		if(sslCtx != null){  //如果安全协议不为空,则要添加多一个handler
			p.addLast(sslCtx.newHandler(ch.alloc()));
		}
		p.addLast(new HttpServerCodec()); //http通信的必须.通信都使用HttpRequest和HttpResponse(当然了,是Netty自带的)
		p.addLast(new HttpHelloWorldServerHandler()); //自己的业务处理Handler
		
	}

}

服务器Handler:

package com.demo.testNetty.http;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaderUtil;
import io.netty.handler.codec.http.HttpHeaderValues;
import io.netty.handler.codec.http.HttpRequest;
import static io.netty.handler.codec.http.HttpHeaderNames.*;
import static io.netty.handler.codec.http.HttpResponseStatus.*;
import static io.netty.handler.codec.http.HttpVersion.*;
public class HttpHelloWorldServerHandler extends ChannelHandlerAdapter{

	private static final byte[] CONTENT = { 'M', 'O', 'S', 'I', ' ', 'M', 'O', 'S', 'I', };
	
	@Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();  //加上这个是最稳的,万一真的忘记flush 哈哈
    }
	
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		if(msg instanceof HttpRequest){
			HttpRequest request  = (HttpRequest) msg;
			if (HttpHeaderUtil.is100ContinueExpected(request)) {
                ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
            }
            boolean keepAlive = HttpHeaderUtil.isKeepAlive(request);
            //构造响应 设置消息头
            FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(CONTENT));
            response.headers().set(CONTENT_TYPE, "text/plain");
            response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());

            if (!keepAlive) {  //如果是短连接,发送完就关闭通道
                ctx.write(response).addListener(ChannelFutureListener.CLOSE);
            } else { //如果是长连接,消息头设置,连接保持活跃
                response.headers().set(CONNECTION, HttpHeaderValues.KEEP_ALIVE); 
                ctx.write(response);
            }
		}
	}
	
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		cause.printStackTrace();
	}
	
}	

客户端呢,就是我们的浏览器咯。

执行服务器:

[11:43:05] nioEventLoopGroup-0-0 INFO  [] [] [io.netty.handler.logging.LoggingHandler] - [id: 0x1ebcdcc2] REGISTERED
Open your web browser and navigate to http://127.0.0.1:8080/
[11:43:05] nioEventLoopGroup-0-0 INFO  [] [] [io.netty.handler.logging.LoggingHandler] - [id: 0x1ebcdcc2] BIND: 0.0.0.0/0.0.0.0:8080
[11:43:05] nioEventLoopGroup-0-0 INFO  [] [] [io.netty.handler.logging.LoggingHandler] - [id: 0x1ebcdcc2, /0:0:0:0:0:0:0:0:8080] ACTIVE

我们复制上面的URL再客户端访问以下。

文件的上传和下载就不在这里弄了。

给个代码的连接:http://note.youdao.com/noteshare?id=487954c7b6254e905da5146fcfbc02f7

 

 

 

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略 草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。...... 阅读详情

相关推荐

从零开始玩转机械臂:用Matlab+Robotics Toolbox实现四自由度机械臂运动仿真

本文详细介绍了如何利用Matlab及其Robotics Toolbox工具箱,从零开始构建并仿真一个四自由度机械臂。通过D-H参数建模、正向运动学验证、交互式操控以及轨迹规划等实践步骤,帮助初学者在虚拟环境中直观理解机器人运动学核心概念,为后续硬件实现奠定坚实基础。

weixin_29055699的博客 325

Netty简介

Netty简介 Netty 是 JBoss 开源项目,是异步的、基于事件驱动的网络应用框架,它以高性能、高并发著称。所谓基于事件驱动,说得简单点就是 Netty 会根据客户端事件(连接、读、写等)做出响应,关于这点,随着文章的论述的展开,读者自然会明白。 Netty 主要用于开发基于 TCP 协议的网络 IO 程序(TCP/IP 是网络通信的基石,当然也是 Netty 的基石,Netty 并没有去改变这些底层的网络基础设施,而是在这之上提供更高层的网络基础设施),例如高性能服务器段/客户端、P2P

weixin_40143533的博客 1027

九齐NY8A051F低功耗模式全解析:从待机到休眠的省电实战

本文全面解析台湾九齐NY8A051F MCU的低功耗模式,从待机到休眠的省电实战技巧。通过实测数据展示四种工作模式的电流消耗差异,提供模式切换的标准流程和唤醒时序优化策略,并分享外围电路省电设计和低电压检测的实战应用,帮助开发者实现物联网设备的超长续航。

weixin_30839881的博客 411

Netty支持的协议

1. TCP/UDP:Netty提供了基于NIO的TCP和UDP编程框架,可以用来构建高性能、高可用性的网络应用。 2. HTTP/HTTPS:Netty提供了HTTP/HTTPS编程框架,可以用来开发Web服务器和客户端。 3. WebSocket:Netty提供了WebSocket编程框架,可以用来实现双向通信应用程序,如聊天室等。 4. SPDY/HTTP2:Netty提供了SPDY和HTTP2编程框架,可以用来实现高效的Web应用程序。 5. MQTT/CoAP:Netty提供了MQTT和CoA

hit、run 2600

从模态到颤振:深入解读Nastran的V-g/V-f图,判断你的机翼设计是否安全

本文深入解析Nastran中的V-g/V-f图在机翼颤振分析中的应用,帮助工程师准确判断设计安全性。通过模态分析到颤振边界的完整判读逻辑,结合气动弹性特性,指导优化机翼结构设计,确保飞行安全。

weixin_28732953的博客 472

Camera AF和FF

Camera按对焦功能可以分为FF(Fixed Focus)和AF(Auto Focus),即固定对焦和自动对焦。固定对焦顾名思义就是焦距是固定的,而自动对焦可以通过移动镜头位置来改变焦距从而实现自动对焦。以前摄像的功能机大多是固定对焦,现在的手机都带有自动对焦功能。 FF模组包括镜头(Lens),传感器(Sensor),红外滤色器(IR Filter),电路板(PCB),镜头支撑(Lens Holder),连接器(Connector)。 Fig 1. FF Module AF模组包括FF模组,音圈马达(V

Coppa的博客 1万+

Netty是一个基于Java的高性能网络应用框架,它支持多种常用的网络协议

SSL/TLS(Secure Sockets Layer/Transport Layer Security):Netty提供了SSL/TLS协议的支持,可以实现安全的加密通信。SSL/TLS协议支持:Netty通过封装Java标准库中的SSL/TLS相关类,提供了对SSL/TLS协议的支持。Netty是一个基于Java的高性能网络应用框架,它提供了丰富的功能和组件,包括对SSL/TLS安全机制的支持,以保障网络通信的安全性。Netty是一个基于Java的高性能网络应用框架,它支持多种常用的网络协议。

[Blog][Domain] programb.blog.youkuaiyun.com 1763

直流电动机的建模仿真(1)他励,串励和并励电动机建模仿真

本文根据不同励磁方式的直流电动机的接线原理图,建立了相应的数学模型,然后根据与数学模型对应的等效电路以及模拟机械运动方程的等效电路,用Matlab/simulink中的SpecializedPower system库中的电路元件,建立了他励,并励和串励直流电动机的全等效电路仿真模型,经过与Matlab自带的直流电动机仿真模型比较以及仿真实例验证,所建立的仿真模型时完全正确的。

weixin_45670943的博客 7520

Netty三、HTTP协议

1. HTTP协议 ​ HTTP (超文本传输协议)协议是建立在TCP传输协议之上的应用层协议,它的发展 是万维网协会和Internet工作小组IETF合作的结果,是一个属于应用层的面向对象 的协议,适用于分布式超媒体信息系统。 1.1. 特点: 支持 Client/Server 模式。 客户向服务器请求服务时,只需指定服务URL,携带必要的请求参数或者消息体。 HTTP允许传输任意类型的数据对象,传输的内容类型由HTTP消息头中的Coment-Type加以标记。 HTTP协议是无状态协议,无状态是指

qq_37813031的博客 991

视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop

Ps教程之神奇的Photoshop自动化技术 10年以上IT行业工作经验、三...

weixin_28812857的博客 1475

ClaudeCode入门01-环境安装(小白入门:手把手教你配置,超简单的一种接入方式)

文手把手教你从零搭建 Claude Code 开发环境。针对国内网络现状,我们采用 OpenRouter + Claude Code Router 的方案,支持支付宝/微信充值,无需科学上网即可完成配置。内容涵盖 Node.js 安装(macOS/Windows/Linux)、OpenRouter 注册与充值、Claude Code 和 Router 安装配置,以及一键启动脚本的编写。跟着截图一步步操作,10分钟搞定全部环境!

yueyeguzhuo的专栏 281

Netty基础知识总结

粘包:多个独立的应用层消息被合并成一个 TCP 数据包传输,接收端无法直接区分原始消息边界。拆包:一个应用层消息被分割成多个 TCP 数据包传输,接收端需要将多个包重组为完整消息。解决方法:1.使用Netty自带的解码器:依次遍历ByteBuf中的可读字节,判断是否有换行符,然后进行截取。:可以自定义分隔符解码器。:固定长度解码器,按照指定的长度进行拆包,长度不够,则空格补全。:长度域解码器,根据发送的数据中消息长度相关参数(长度域偏移量)来进行拆包。2.自定义序列化偏移量Java自带有实现。

hywzxy的博客 872

clock min pulse width检查

高电平脉宽 = clock fall edge到达FF/CK的时间 - clock rise edge到达FF/CK的时间;低电平脉宽 = 下一T clock rise edge到达FF/CK的时间 - clock fall edge到达FF/CK的时间。而required pulse width是根据FF/CK处的transition,根据查找表计算得到的。为什么clock transition越大,会导致required pulse width越大呢?5、 降低clock上的串扰。

芯冰乐 577

Netty详细介绍

Netty 是一个基于 Java 的异步事件驱动的网络应用程序框架,用于快速开发高性能、高可靠性的网络服务器和客户端。它是由旗下的一位开发者创建的,并以开源的形式发布在上。自从诞生以来,Netty 在网络通信领域取得了广泛的应用,尤其是在高并发和低延迟的场景中表现出色。

Flying_Fish_roe的博客 1589

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

编程语言Netty原理浅析

编程语言Netty原理浅析 一、Netty简介 1、Netty是异步的、基于事件驱动的网络应用框架,它以高性能、高并发著称。基于事件驱动,简单点说就是 Netty 会根据客户端的连接请求、读、写等事件 做出相应的响应。 2、Netty 主要用于开发基于 TCP 协议的网络 IO 程序。例如构建高性能RPC,实现高性能服务器/客户端程序等等。同时Netty也支持UDP、HTTP、WebSocket等多种主流协议。 3、Netty 是基于 Java NIO 构建出来的,NIO是指非阻塞式IO,利

697

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Netty概述

Netty是由JBOSS提供的一个java开源框架 Netty是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能‘高可靠性的网络IO程序 Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用 Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景 要透彻理解Netty,需要先学习NIO。 2|0二、IO模型 IO模型简单理解,就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。

嘿嘿 444

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Netty简介与自定义基于http和websocket协议的服务器

Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发本质:网络应用程序框架实现:异步、事件驱动特性:高性能、可维护、快速开发用途:开发服务器和客户端Netty的性能很高,按照Facebook公司开发小组的测试表明,Netty最高能达到接近百万的吞吐。

weixin_46678115的博客 1022

Netty使用篇:Http协议编解码

Netty:Http协议编解码

七叔的博客 2万+

Netty 入门教程

什么是Netty? Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty和Tomcat有什么区别? Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Ht...

wu_amber的博客 3564

Netty对http 协议解析原理解析(超级推荐)

目录 1 http协议 1.1 描述 1.2 请求包 1.3 响应包 2chunked介绍 2.1 背景 2.2 Content-Length描述 2.3 chunked描述 2.4 truncked协议 2.5 优点 2.6缺点 3 压缩 3.1 背景 3.2 压缩类型 3.3 tomcat实现 3.4 优点 3.5 缺点 4 keepalive ...

时光钟摆 3217

Netty入门(三) HTTP协议开发

HTTP协议不仅可以用来处理浏览器与服务器通信,还可以用在服务器与客户端的通信中。HTTP协议是建立在TCP/IP协议之上的应用层协议,其已经封装好了自己的特点和传输规则,不用考虑底层的拆包粘包问题,有时用起来相对于TCP/IP更为方便。举个例子来说,TCP协议相当于零件,而HTTP相当于零件组装成的一种产品,实现一种特定的功能。

这里是阿安的博客 1584

netty支持哪些协议_【IT新手之路】Netty学习之旅(一)

你知道网络架构分层吗?TCP/UDP各有什么优缺点? 你知道网络通信过程吗?一次https请求要经历哪些流程? 你知道网络IO模型吗?c10k问题是如何解决的? 你知道Java如何实现网络编程吗?Netty在Java Nio上做了哪些优化呢?个人认为,学习知识,应该先构建知识全貌,然后再针对核心知识点进行学习,最终将每个知识点串联起来,融会贯通,即最终要构建我们的知识体系.所以,这篇文章...

weixin_39660922的博客 4022

【基于Netty实现Http通信、实现UDP单播和广播通信、代码案例实战学习】

【基于Netty实现Http通信、实现UDP单播和广播通信、代码案例实战学习】Netty 为许多通用协议提供了编解码器和处理器,几乎可以开箱即用,减少了我们在繁琐的事务上花费的时间。1. HTTP 是基于请求/响应模式的:客户端向服务器发送一个HTTP 请求,然后服务器将会返回一个HTTP 响应。Netty 提供了多种编码器和解码器以简化对这个协议的使用。 2. 一个HTTP 请求/响应可能由多个数据部分组成,DefaultFullHttpRequest和DefaultFullHttpResponse消息是

Coder_ljw的博客 2419

【netty系列-10】通过netty实现http请求

通过netty实现http请求

zhenghuishengq的博客 3618

Netty 实现 HTTP 协议教程

在`decode`方法中,我们将请求内容解析为JSON格式,并从中提取出请求方法、URI、HTTP版本和头部字段等信息,然后创建一个`HttpRequest`对象并将其添加到输出列表中。接下来,我们将使用 Netty 实现一个简单的 HTTP 客户端,该客户端将向我们之前实现的 HTTP 服务器发送一个 GET 请求,并打印服务器返回的响应内容。接下来,我们将使用 Netty 实现一个简单的 HTTP 服务器,该服务器将监听端口 8080,并处理客户端的 GET 请求,返回一个简单的 HTML 页面。

持续分享有趣的技术干货 1225

Netty 实现http协议

这里简单介绍下,项目中使用netty在main方法中启动项目,实现http协议。 maven依赖的包 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.27.Final</versi...

u011038738的专栏 2191
上一篇: Netty之心跳检测(可应用在分布式架构)
下一篇: Linux下搞一个Java开发环境
Howinfun
博客等级 码龄10年 165粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值