通过netty提供Protobuf服务

标签: netty protobuf 服务 | 发表时间:2014-02-21 14:37 | 作者:
出处:http://www.iteye.com

1、下载安装Protocol Buffer

    >下载地址: http://code.google.com/p/protobuf/
    >需要下载文件:protobuf-2.5.0.tar.gz(也可以直接下载protobuf-java-2.5.0.jar;这里通过maven生成);protoc-2.5.0-win32.zip(windows平台需要)。
    >解压protobuf-2.5.0.tar.gz文件,存放在D:\java\protobuf-2.5.0目录下
    >解压protoc-2.5.0-win32.zip,得到protoc.exe文件;为了方便使用这里把protoc.exe文件复制到C:\Windows\System32目录下。为了通过maven编译得到jar文件,还需要把protoc.exe复制到D:\java\protobuf-2.5.0\src\目录下。
    >打开win终端(运行->cmd),cd D:\java\protobuf-2.5.0\java,mvn package。然后在D:\java\protobuf-2.5.0\java\target\目录下生成protobuf-java-2.5.0.jar文件(用于java工程,也可以通过maven获得)。
    ---------------------------到此安装完成。
 
2、编写Protobuf 的proto文件,保存到e:\workPlace\protobuf\目录下。
    >简单消息(SimpleMsg.proto)
        package protobuf;
        option java_package = "com.jan.pr.protobuf";
        option java_outer_classname = "SimpleMessage";
 
        message Message{
            required int32 id=1;
            required string key=2;
            required string content=3; 
        }
    
    >嵌套消息(CarInfoMsg.proto)
          option java_package = "com.umpay.pr.protobuf";
option java_outer_classname = "CarInfos";
 
message Car{
enum CarModel{
BENZ = 0;
VOLKSWAGEN =1;
FORD = 2;
CHEVROLET = 3;
TOYOTA = 4;
Peugeot = 5;
enum Sex{
FEMALE = 0;
MALE = 1;
}
message CarOwner{
required string name=1;
required Sex sex = 2 [default = MALE];
required int32 age=3;
required float height=4;
}
message CarInfo{
required string carNumber=11;
required string brand=12;
required string color=13;
required CarModel model = 14 [default=FORD];
required int64 price=15;
required CarOwner owner=16;
}
}
 
3、生成Java代码
    运行命令:protoc.exe --java_out=./ ./CarInfoMsg.proto,会在e:\workPlace\protobuf\目录下生成com这样的目录,找到里面的CarInfos.java文件。
 
 
4、Netty服务端(ProtobufNettyServer.java)
package com.umpay.pr.protobuf;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.protobuf.ProtobufEncoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import com.umpay.pr.protobuf.CarInfos.Car.CarInfo;
import com.umpay.pr.protobuf.CarInfos.Car.CarModel;
import com.umpay.pr.protobuf.CarInfos.Car.CarOwner;
import com.umpay.pr.protobuf.CarInfos.Car.Sex;
/** 
 * desc:Htty服务端
 */
public  class ProtobufNettyServer {
    
     public  static  void main(String[] args) {
        ServerBootstrap serverBootstrap =  new ServerBootstrap( new NioServerSocketChannelFactory(
                Executors.newSingleThreadExecutor(), Executors.newSingleThreadExecutor()));
        serverBootstrap.setPipelineFactory( new ChannelPipelineFactory() {
            
             public ChannelPipeline getPipeline()  throws Exception {
                ChannelPipeline pipeline = Channels.pipeline();
                pipeline.addLast("protobufDecoder",  new ProtobufVarint32FrameDecoder());  //netty自带的解码器
                pipeline.addLast("protobufEncoder",  new ProtobufEncoder());  //netty自带的编码器
                pipeline.addLast("handler",  new ProtobufServerHandler());  //服务handler
                 return pipeline;
            }
        });
        serverBootstrap.bind( new InetSocketAddress("0.0.0.0",8080));
    }
}
/** 
 * desc:服务handler
 */
class ProtobufServerHandler  extends SimpleChannelHandler{
    /* 
     * desc:
     * (non-Javadoc)
     * @see org.jboss.netty.channel.SimpleChannelHandler#channelConnected(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.ChannelStateEvent)
     */
    @Override
     public  void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)  throws Exception {
        CarInfo o  = carInfosTrans();
        System.out.println("输出~~"+ o.getClass());
        ChannelFuture future = e.getChannel().write(o);
        future.addListener(ChannelFutureListener.CLOSE);
    }
    
    /* 
     * desc:
     * (non-Javadoc)
     * @see org.jboss.netty.channel.SimpleChannelHandler#exceptionCaught(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.ExceptionEvent)
     */
    @Override
     public  void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)  throws Exception {
//        super.exceptionCaught(ctx, e);
        System.err.println("Unexpected exception from downstream." + e.getCause());
        e.getChannel().close();
    }
    
     private CarInfo carInfosTrans(){
        CarOwner.Builder owner = CarOwner.newBuilder();
        owner.setAge(18);
        owner.setHeight(170);
        owner.setName("jimmy");
        owner.setSex(Sex.FEMALE);
        CarInfo.Builder carInfo = CarInfo.newBuilder();
        carInfo.setBrand("大众");
        carInfo.setCarNumber("粤A 88888");
        carInfo.setColor("red");
        carInfo.setModel(CarModel.VOLKSWAGEN);
        carInfo.setPrice(1000);
        carInfo.setOwner(owner);
        
        CarInfo carInfoReq = carInfo.build();
//        long size = carInfoReq.getSerializedSize();
//        byte[] buf = carInfoReq.toByteArray();
         return carInfoReq;
    }
}
    
5、Netty客户端代码(ProtobufSocketClient.java)
package com.umpay.pr.protobuf;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import com.umpay.pr.protobuf.CarInfos.Car.CarInfo;
/** 
 * desc:
 * @version V1.0  
 */
public  class ProtobufSocketClient {
     public  static  void main(String[] args) {
         try {
            Socket socket =  new Socket("127.0.0.1", 8080);
            InputStream in = socket.getInputStream();
            CarInfo recCarInfo = CarInfo.parseFrom(in);
            System.out.println(recCarInfo.getBrand());
            System.out.println(recCarInfo.getCarNumber());
            in.close();
            socket.close();
        }  catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}
 
客户端输出=====
大众
粤A 88888
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [netty protobuf 服务] 推荐:

通过netty提供Protobuf服务

- - ITeye博客
1、下载安装Protocol Buffer.     >下载地址: http://code.google.com/p/protobuf/.     >需要下载文件:protobuf-2.5.0.tar.gz(也可以直接下载protobuf-java-2.5.0.jar;这里通过maven生成);protoc-2.5.0-win32.zip(windows平台需要).

java游戏开发入门2_基于netty+protobuf的游戏框架

- - 行业应用 - ITeye博客
/** 刚开始学习游戏开发时想找一个基于netty的游戏demo十分困难,工作一段时间后了解框架后将其分享出来; 该框架是从别人框架移植修改完善而来,不是我一个人写,算是借花献佛; 实际业务开发比此框架要复杂得多,去繁从简主在体现核心思想; 这是游戏开发入门的第2篇,如果有不完善的地方请多多指导.  框架示意图如下,源代码参看: github:.

Netty 长连接服务

- - 非技术 - ITeye博客
还记得一年半前,做的一个项目需要用到  Android 推送服务. 和  iOS 不同,Android 生态中没有统一的推送服务. Google 虽然有  Google Cloud Messaging ,但是连国外都没统一,更别说国内了,直接被墙. 所以之前在 Android 上做推送大部分只能靠轮询.

Netty系列之Netty百万级推送服务设计要点

- - 开源软件 - ITeye博客
原文地址:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk.

socketio-netty(socket.io 服务器端JAVA实现) 近期升级手记

- - BlogJava-首页技术区
针对JAVA开发者, socketio-netty是一个socket.io的服务器端选择,又是目前兼容最新0.9+ – 1.0的JAVA服务器端实现. 从 http://socket.io官网来看,最近版本升级趋于缓和,几乎是没修正一个Bug,小版本就增加一次. 已经是非常稳定的版本了,可以真正使用了.

Mina、Netty、Twisted一起学:实现简单的TCP服务器

- - CSDN博客推荐文章
MINA、Netty、Twisted为什么放在一起学习. 首先,不妨先看一下他们官方网站对其的介绍:. (Twisted官网的文案不专业啊,居然不写asynchronous). 从上面简短的介绍中,就可以发现它们的共同特点:event-driven以及asynchronous. 它们都是 事件驱动、异步的网络编程框架.

socketio-netty : 又一款socket.io服务器端实现,兼容0.9-1.0版本~

- - BlogJava-首页技术区
socket.io是一个跨浏览器的全平台反响AJAX实现,官网(http://socket.io)定义为:the cross-browser WebSocket for realtime apps.. 个人认为这是一个跨浏览器的集大成者,支持桌面端和移动端浏览器(http://socket.io/#browser-support):.

100万并发连接服务器笔记之Java Netty处理1M连接会怎么样

- - BlogJava-首页技术区
每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼. netty NIO框架(netty-3.6.5.Final),封装的很好,接口很全面,就像它现在的域名 netty.io,专注于网络IO. 整个过程没有什么技术含量,浅显分析过就更显得有些枯燥无聊,准备好,硬着头皮吧.

Netty系列之Netty高性能之道

- - CSDN博客推荐文章
最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用. 相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多. 事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的设计Reactor线程模型,达到上述性能指标是完全有可能的.

Netty代码分析

- LightingMan - 淘宝JAVA中间件团队博客
Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序[官方定义],整体来看其包含了以下内容:1.提供了丰富的协议编解码支持,2.实现自有的buffer系统,减少复制所带来的消耗,3.整套channel的实现,4.基于事件的过程流转以及完整的网络事件响应与扩展,5.丰富的example.