1. 程式人生 > >例項:Netty 基於Http協議下的資料傳輸Demo

例項:Netty 基於Http協議下的資料傳輸Demo

Http/Https協議是最重要最常用到的協議之一,Netty提供了一些了的Handler來處理Http協議下的編碼工作。下面就介紹一個Netty例項:

1.通過HttpClient傳送Protobuf型別資料到服務端

2.服務端Netty負責把接收到的Http請求中的資料再發送到客戶端。

3.其中Netty對傳送的資料量沒有限制,因為Http傳送的message往往是由一系列infragment構成,Netty可以把接收到的http請求片段資訊整合(Aggregator)到一起,最終得到一個FullHttpRequest。

Client端:

package NettyDemo.echo.client;

import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import NettyDemo.echo.protocal.AddressBookProtos;
import NettyDemo.echo.server.HttpProtobufServer;

public class HttpClientDemo {
	public static void main(String[] args) throws ClientProtocolException,
			IOException {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		HttpHost proxy = new HttpHost(HttpProtobufServer.IP,
				HttpProtobufServer.PORT);
		httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
				proxy);
		HttpPost httppost = new HttpPost("");
		AddressBookProtos.AddressBook.Builder address = AddressBookProtos.AddressBook
				.newBuilder();
		for (int i = 0; i < 20000; i++) {
			AddressBookProtos.Person.Builder person = AddressBookProtos.Person
					.newBuilder();
			person.setName("HeavenWang");
			person.setId(i);
			person.setEmail("
[email protected]
"); address.addPerson(person); } ByteArrayEntity entity = new ByteArrayEntity(address.build().toByteArray()); httppost.setEntity(entity); HttpResponse response = httpclient.execute(httppost); HttpEntity receiveEntity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (receiveEntity != null) { System.out.println("Response content length: " + receiveEntity.getContentLength()); } System.out.println("success"); } }

伺服器端NettyService:

<span style="font-size:12px;">package NettyDemo.echo.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import io.netty.handler.codec.http.HttpServerCodec;
import NettyDemo.echo.handler.HttpProtobufServerHandler;

public class HttpProtobufServer {
	public static final String IP = "127.0.0.1";
	public static final int PORT = 8080;
	//private static MessageLite lite=AddressBookProtos.AddressBook.getDefaultInstance();
	/**用於分配處理業務執行緒的執行緒組個數 */
	protected static final int BIZGROUPSIZE = Runtime.getRuntime().availableProcessors()*2;	//預設
	/** 業務出現執行緒大小*/
	protected static final int BIZTHREADSIZE = 4;
	private static final EventLoopGroup bossGroup = new NioEventLoopGroup(BIZGROUPSIZE);
	private static final EventLoopGroup workerGroup = new NioEventLoopGroup(BIZTHREADSIZE);
	protected static void run() throws Exception {
		ServerBootstrap b = new ServerBootstrap();
		b.group(bossGroup, workerGroup);
		b.channel(NioServerSocketChannel.class);
		b.childHandler(new ChannelInitializer<SocketChannel>() {
			@Override
			public void initChannel(SocketChannel ch) throws Exception {
				ChannelPipeline pipeline = ch.pipeline();				
				pipeline.addLast("decoder", new HttpRequestDecoder());
				/**usually we receive http message infragment,if we want full http message,
				 * we should bundle HttpObjectAggregator and we can get FullHttpRequest。
				 * 我們通常接收到的是一個http片段,如果要想完整接受一次請求的所有資料,我們需要繫結HttpObjectAggregator,然後我們
				 * 就可以收到一個FullHttpRequest-是一個完整的請求資訊。
				**/
				pipeline.addLast("servercodec",new HttpServerCodec());
				pipeline.addLast("aggegator",new HttpObjectAggregator(1024*1024*64));//定義緩衝資料量
				pipeline.addLast(new HttpProtobufServerHandler());
				pipeline.addLast("responseencoder",new HttpResponseEncoder());
			}
		});
		b.bind(IP, PORT).sync();
		System.out.println("TCP伺服器已啟動");
	}

	protected static void shutdown() {
		workerGroup.shutdownGracefully();
		bossGroup.shutdownGracefully();
	}

	public static void main(String[] args) throws Exception {
		System.out.println("開始啟動http伺服器...");
		HttpProtobufServer.run();
//		TcpServer.shutdown();
	}
}
</span>

Handler:

package NettyDemo.echo.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;

public class HttpProtobufServerHandler extends SimpleChannelInboundHandler<Object>{
	@Override
	protected void channelRead0(ChannelHandlerContext ctx,	Object msg) throws Exception {
		DefaultFullHttpRequest request=(DefaultFullHttpRequest)msg;
		DefaultFullHttpResponse response=new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.ACCEPTED, request.content());
		ctx.writeAndFlush(response);
	}

	
}


附:FullHttpRequest構成,因此一個FullHttpRequest會包含請求message的所有片段。

相關推薦

例項Netty 基於Http協議資料傳輸Demo

Http/Https協議是最重要最常用到的協議之一,Netty提供了一些了的Handler來處理Http協議下的編碼工作。下面就介紹一個Netty例項: 1.通過HttpClient傳送Protobuf型別資料到服務端 2.服務端Netty負責把接收到的Http請求中的資料

基於http協議的加密傳輸方案

轉載自:https://www.cnblogs.com/mq0036/p/8274975.html 最近公司需要通過公網與其它平臺完成介面對接,但是基於開發時間和其它因素的考慮,本次對接無法採用https協議實現。既然不能用https協議,那就退而求其次採用http協議吧! 那麼問題來了!在

Protobuf二進位制檔案基於Http協議傳輸的應用例項 ☞ Python與Java之間無關語言的資料傳輸

       在前兩篇中,博主介紹了Google Protocol Buffer【一種資料互動格式】在Python和Java中各自的應用例項,重點就是掌握和理解如何構造protobuf的協議檔案.proto:檔案中的資料組織結構是以messgae打頭的,message訊息體裡

基於HTTP協議的輕量級開源簡單隊列服務HTTPSQS[轉]

海量數據 短信 最大 ima 站內搜索 功能 .html 調用 python HTTPSQS(HTTP Simple Queue Service)是一款基於 HTTP GET/POST 協議的輕量級開源簡單消息隊列服務,使用 Tokyo Cabinet 的 B+Tree K

基於HTTP協議的幾種實時資料獲取技術(轉)

轉載自五月的倉頡 HTTP協議 HTTP協議是建立在TCP協議上的應用層協議,協議的本質是請求----應答: 即對於HTTP協議來說,服務端給一次響應後整個請求就結束了,這是HTTP請求最大的特點,也是由於這個特點,HTTP請求無法做到的是服務端向客戶端主動推送資料。 但由於H

Python Django 前後端資料互動 之 HTTP協議GET與POST的區別 99%的人都理解錯了HTTP中GET與POST的區別(轉自知乎)

99%的人都理解錯了HTTP中GET與POST的區別(轉自知乎)   作者:Larry 連結:https://zhuanlan.zhihu.com/p/22536382 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授

http協議為什麼請求與響應會做到準確誤的對應。不會出現請求與響應的錯亂

網際網路通訊是套接字進行通訊的,套接字,是支援TCP/IP的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,簡單的說就是通訊的兩方的一種約定,用套接字中的相關函式來完成通訊過程。 非常非常簡單的舉例說明下:套接字=Ip address+ TCP/UDP + port。 j

基於HTTP協議,以JSON為資料互動格式的RESTful API。

向Elasticsearch發出的請求的組成部分與其他普通的HTTP請求是一樣的: curl -X<VERB> '<PROTOCOL>://<HOST>/<PORT>?<QUERY_STRING>' -d '<

android如何利用基於Http 協議的WebService服務來獲取遠端資料庫資料

初學android,這個問題困擾了多天,在搜尋引擎及論壇各位高手的幫助下,現在終於給搞定了,在這裡分享給大家,希望對大家有所幫助!(其實本來是嘗試用SOAP協議的,試了n天,無果,無奈又只能回到http了!)先來看看伺服器端吧! 首先新建一個ASP.NET Web服務應用程

netty簡單實現檔案上傳接收 (OSS物件倉庫) 基於Http 協議.

1.gradle配置(mvn童鞋自行分解)讓其支援json : compile group: 'io.netty', name: 'netty-all', version: '4.1.9.Final' compile 'com.google.code.gson:gson:2

基於HTTP協議的幾種實時資料獲取技術

HTTP協議 HTTP協議大家都很熟悉了,開始本文之前,首先簡單回顧一下HTTP協議。 HTTP協議是建立在TCP協議上的應

Java中基於HTTP協議網絡編程

copy 統一 throws 網絡編程 設置 查詢 trac enc pac java中為我們的網絡支持提供了java.net包,能夠使我們以編程的方式來訪問Web服務功能,這篇博客,就跟大家分享一下。Java中的網絡編程的知識。主要是學習下該java.net包下的

HTTP協議可拖動時間軸播放FLV的實現(偽流媒體)

prot pac -m method bytes encoding 編寫 時間軸 delay HTTP協議下實現FLV的播放其實並不復雜,當初實現的原理是使用了flowPlayer插件實現的,效果還不錯。但仍有兩大問題影響著客戶的訪問情緒: 1.預加載時頁面卡死,似乎沒有

Spring Security 集成 CAS(基於HTTP協議版本)

可能 key 1.3 remove gin repo produce writing monit Spring Security 集成 CAS(基於HTTP協議版本) 近段時間一直研究Spring Security 集成 CAS,網上資料相關資料也很多,不過大都是基於Htt

基於HTTP 協議認證介紹與實現

idt 興趣 cati 生成 保護 進行 pos 響應 label 導言 一直對http 的頭認證有興趣,就是路由器的那種彈出對話框輸入賬號密碼怎麽實現一直不明白,最近,翻了一下http 協議,發現這是一個RFC 2617的實現,所以寫篇文章介紹一下吧. Http基本認證

基於HTTP協議的幾種實時數據獲取技術

net 時有 消息服務 成功 哪裏 實現 http請求 服務 結果 原文鏈接https://www.cnblogs.com/xrq730/p/9280404.html,作者博客園----五月的倉頡,轉載請註明出處,謝謝 HTTP協議 HTTP協議大家都很熟悉了,開

api介面對於客戶端的身份認證方式以及安全措施 基於http協議的api介面對於客戶端的身份認證方式以及安全措施

轉載 基於http協議的api介面對於客戶端的身份認證方式以及安全措施  由於http是無狀態的,所以正常情況下在瀏覽器瀏覽網頁,伺服器都是通過訪問者的cookie(cookie中儲存的jsessionid)來辨別客戶端的身份的,當客戶端進行登入伺服器也會將登入資訊存放在伺服器並與客戶端的coo

基於tcp協議粘包現象和解決方案

一、緩衝區   每個 socket 被建立後,都會分配兩個緩衝區,輸入緩衝區和輸出緩衝區。write()/send() 並不立即向網路中傳輸資料,而是先將資料寫入緩衝區中,再由TCP協議將資料從緩衝區傳送到目標機器。一旦將資料寫入到緩衝區,函式就可以成功返回,不管它們有沒有到達目標機器,也不管它們何時被髮送

Nginx + Tomcat基於HTTP協議實現反代、動靜分離、負載均衡和session會話保持

1、演示環境: IP 作業系統 部署程式 192.168.1.143 CentOS 7.5 Nginx 192.168.1.144 CentOS 7.5 Tomcat

Apache + Tomcat基於HTTP協議實現反代、動靜分離、負載均衡和session會話保持

1、演示環境: IP 作業系統 部署程式 192.168.1.143 CentOS 7.6 Apache 192.168.1.144 CentOS 7.6 Tomcat