netty版本5.0,google protobuf版本2.5.java
netty自帶的例子io.netty.example.worldclock,就是使用protobuf做爲網絡協議.網絡
本文實現客戶端-服務端之間請求-響應的網絡協議,會在worldclock例子上稍做擴展.ui
首先定義protobuf,對於多種請求的格式,使用Union Type,如下Login,Service分別擴展了Request.this
message Request { extensions 100 to max; enum Type{ LOGIN=0; SERVICE=1; } required Type type=1; } extend Request { optional Login login = 100; optional Service service = 101; } message Login { required string user = 1; required string pswd = 2; } message Service { optional string content = 1; } message Response { optional string result = 1; }
客戶端的主要代碼,其餘參考worldclock例子.google
Login login = Login.newBuilder().setUser("it is user!") .setPswd("it is pswd!").build(); Request.Builder builder = Request.newBuilder(); builder.setType(Request.Type.LOGIN); builder.setExtension(Protocol.login, login); Request request = builder.build(); ch.writeAndFlush(request).sync();
服務端的主要代碼.spa
switch (request.getType().getNumber()) { case (Request.Type.LOGIN_VALUE): System.out.println(request.getExtension(Protocol.login).getUser() + " " + request.getExtension(Protocol.login).getPswd()); break; case (Request.Type.SERVICE_VALUE): break; default: System.out.println("Don't know this type"); } Response.Builder builder = Response.newBuilder(); builder.setResult("I am response result!"); ctx.writeAndFlush(builder.build()).sync();
要注意的是在服務端,你還要告訴netty,protobuf的extension如何解碼..net
ExtensionRegistry registry = ExtensionRegistry.newInstance(); Protocol.registerAllExtensions(registry); ChannelPipeline p = ch.pipeline(); p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder()); p.addLast("protobufDecoder", new ProtobufDecoder(Protocol.Request.getDefaultInstance(), registry)); p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender()); p.addLast("protobufEncoder", new ProtobufEncoder());
如下是和worldclock例子中不一樣的地方.netty
ExtensionRegistry registry = ExtensionRegistry.newInstance(); Protocol.registerAllExtensions(registry); p.addLast("protobufDecoder", new ProtobufDecoder(Protocol.Request.getDefaultInstance(),registry));
參考:code
http://netty.io/ blog
https://developers.google.com/protocol-buffers/
http://blog.wolfman.com/articles/2011/11/23/how-to-implement-polymorphic-protocol-buffers-in-java