Netty-Http

最近在做NettyHttp服务相关的东西,发现在网上找各种资料始终不全面或者不准确,最好的方式还是看官方API文档+了解HTTP协议本身的设计:

1:Netty官方API文档:http://netty.io/4.0/api/index.html

2:HTTP协议本身的设计:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

我们首先根据HTTP协议本身的设计,看Netty针对HTTP给出的解决方案:

Http

http请求由三部分组成,分别是:请求行、消息报头、请求正文。

Netty中使用类HttpRequest来处理HTTP请求。

  • 请求行

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF

其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)

HttpRequest类有如下get方法,分别用来获取HttpRequest请求的各个部分:

				request.getMethod();//获取Method
				request.getClass();
				request.getProtocolVersion();//获取HTTP-Version
				request.getUri();//获取Request-URI
				request.getDecoderResult();

Netty的Handler中的参数类型为HttpObject msg;

public void channelRead0(ChannelHandlerContext ctx, HttpObject msg)

我们根据API文档可以知道HttpObject类的派生类有如下:

io.netty.handler.codec.http
Interface HttpObject

All Known Subinterfaces:
FullHttpMessage, FullHttpRequest, FullHttpResponse, HttpContent, HttpMessage, HttpRequest, HttpResponse, LastHttpContent
All Known Implementing Classes:
DefaultFullHttpRequest, DefaultFullHttpResponse, DefaultHttpContent, DefaultHttpMessage, DefaultHttpObject, DefaultHttpRequest, DefaultHttpResponse, DefaultLastHttpContent

可以知道Netty可以在Handler中处理这些HttpObject派生类对象。我们当前仅仅讨论HttpRequest对象的解析而已。

  • 消息报头

request.headers();
通过这个函数可以获取到HTTP协议中的消息头。对于消息头有那些解决方案,可以通过函数后面自己详细分析。

 

HttpResponse

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文

Netty中HttpResponse相关的类有:


我们以FullHttpResponse来分析Netty对Http回包的支持

FullHttpResponse response = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf);

这是构建一个回包,同时可以通过:

response.getProtocolVersion()

response.getStatus()

分别获取协议版本和响应状态码

1、状态行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

我们可以看出,Netty的Http回包里,只有HTTP-Version Status-Code两项,之后就是回包内容了。

2、响应报头后述

Netty中的响应报头相关类有如下:


其中,我们可以通过HttpHeaders这个类(更准确的说是DefaultHttpHeaders)来获取HttpHeaderEntity

对返回消息头的使用一般如下:

		Gson gson = new Gson();
		ByteBuf buf = copiedBuffer(gson.toJson(outMap), CharsetUtil.UTF_8);
		// Decide whether to close the connection or not.
		boolean close = HttpHeaders.Values.CLOSE.equalsIgnoreCase(request
				.headers().get(HttpHeaders.Names.CONNECTION))
				|| request.getProtocolVersion().equals(HttpVersion.HTTP_1_0)
				&& !HttpHeaders.Values.KEEP_ALIVE.equalsIgnoreCase(request
						.headers().get(HttpHeaders.Names.CONNECTION));
		// 构建回包
		FullHttpResponse response = new DefaultFullHttpResponse(
				HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf);
		//Content-Encoding:已经被应用到实体正文的附加内容的编码
		response.headers().set(HttpHeaders.Names.CONTENT_ENCODING,HttpHeaders.Values.BASE64);
		//是否
		response.headers().set(HttpHeaders.Names.CACHE_CONTROL,HttpHeaders.Values.NO_CACHE);
		//Content-Type:实体报头域用语指明发送给接收者的实体正文的媒体类型
		response.headers().set(HttpHeaders.Names.CONTENT_TYPE,"text/plain; charset=UTF-8");
		//將回包內容的長度放到Header中
		if (!close) {
			//Content-Length:实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示
			response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, buf.readableBytes());
		}


3、响应正文就是服务器返回的资源的内容 








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty-socketio是一个用于构建实时通信应用程序的开源框架。它基于Netty框架,通过使用WebSocket协议来实现异步、高性能的网络通信。Netty-socketio具有以下特点: 1. 强大的异步处理能力:Netty-socketio采用事件驱动的方式处理客户端请求,能够高效地处理大量并发连接。 2. 完善的消息传递机制:Netty-socketio提供了灵活的消息传递方式,支持广播、点对点、房间等不同的消息发送方式,满足不同场景下的通信需求。 3. 多协议支持:Netty-socketio不仅支持WebSocket协议,还支持其他常用的协议,如TCP、HTTP等,便于与现有的系统集成。 4. 可扩展性强:Netty-socketio提供了丰富的拓展接口,用户可以根据自己的需求定制和扩展框架的功能。 5. 易于使用:Netty-socketio提供了简洁的API和丰富的文档,可以快速上手使用,并提供了相应的示例代码,方便开发者学习和理解。 对于客服应用来说,Netty-socketio作为一个实时通信框架,可以用于构建在线客服聊天系统。通过使用Netty-socketio,我们可以实现客户与客服人员之间的实时消息传递,支持文字、图片、文件等多种类型的消息。客户可以通过网页或移动端应用与客服人员进行沟通,实时解决问题,提升用户体验。 Netty-socketio提供了强大的异步处理能力和全双工通信机制,能够处理大量并发连接,并保持连接的稳定性和可靠性。同时,它的多协议支持和可扩展性强的特点,使得我们可以根据自己的业务需求进行定制和拓展,满足不同客服场景下的通信需求。 总之,Netty-socketio作为一个强大的实时通信框架,为客服应用提供了一种高效、稳定的解决方案,帮助企业构建更好的客服系统,并提升客户的满意度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值