在netty中使用google protobuf

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

相關文章
相關標籤/搜索