注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

Java中的Protobuf使用例子(转)  

2016-06-08 08:34:36|  分类: 服务器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

protobuf接口文件的生成这里就不举例子,只举一下在Java中怎么使用。

1). 定义"消息"的结构,即书写接口定义文件(.proto文件)。本例中,消息包含了"手机信息"。

文件名 mobile.proto

文件内容如下:

message MobilePhone{    
            
    required string               brand = 1 ;    
    required Hardware          hardware = 2;
    repeated string              software = 3;                    

}

message Hardware {

    required int32                    rom = 1; 
    required int32                    ram = 2;      
    required int32                    size = 3 ;    
    
}


2).通过定义的接口文件,生成Mobile.java

执行命令: protoc  --java_out=outputFile sourceFile

上述命令中outputFile 和 sourceFile 指 输出文件和源文件,需替换成实际文件(路径)名,如:

protoc  --java_out=./src   ./proto/mobile.proto


3).创建工程,编码

引入protobuf-java-2.4.1.jar

拷贝Mobile.java至工程

书写客户端,服务端代码。

具体代码如下:

客户端

package com.nevermore.client;

import java.net.Socket;

import com.nevermore.domain.Mobile;

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Socket socket = new Socket("127.0.0.1",3030);
        Mobile.MobilePhone.Builder builder = Mobile.MobilePhone.newBuilder();
        Mobile.Hardware.Builder hardware = Mobile.Hardware.newBuilder();
        hardware.setRam(2).setRom(16).setSize(5);
        builder.setHardware(hardware)
               .setBrand("Apple")
               .addSoftware("camera")
               .addSoftware("tecent")
               .addSoftware("browser")
               .addSoftware("player");
        byte[] messageBody = builder.build().toByteArray();
    
        int headerLen = 1;
        byte[] message = new byte[headerLen+messageBody.length];
        message[0] = (byte)messageBody.length;
        System.arraycopy(messageBody, 0,  message, 1, messageBody.length);
        System.out.println("msg len:"+message.length);
        socket.getOutputStream().write(message);
    }

}

服务端:

import java.net.ServerSocket;
import java.net.Socket;

import com.nevermore.domain.Mobile;
import com.nevermore.domain.Mobile.MobilePhone;

public class Server {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        ServerSocket serverSock = new ServerSocket(3030);
        Socket sock = serverSock.accept();
        byte[] msg = new byte[256];
        sock.getInputStream().read(msg);
        int msgBodyLen = msg[0];
        System.out.println("msg body len:"+msgBodyLen);
        byte[] msgbody = new byte[msgBodyLen];
        System.arraycopy(msg, 1, msgbody, 0, msgBodyLen);
        MobilePhone phone = Mobile.MobilePhone.parseFrom(msgbody);
        System.out.println("Receive:");
        System.out.println(phone.toString());
    }

}


运行后服务端打印:

Receive:
brand: "Apple"
hardware {
  rom: 16
  ram: 2
  size: 5
}
software: "camera"
software: "tecent"
software: "browser"
software: "player"

转自:http://my.oschina.net/u/1162561/blog/364772

外加一个字符串转整数和整数转字符串的工具:
/**
     * int到byte[]
     * @param i
     * @return
     */
    public static byte[] intToByteArray(int i) {   
          byte[] result = new byte[4];   
          //由高位到低位
          result[0] = (byte)((i >> 24) & 0xFF);
          result[1] = (byte)((i >> 16) & 0xFF);
          result[2] = (byte)((i >> 8) & 0xFF); 
          result[3] = (byte)(i & 0xFF);
          return result;
        }

        /**
         * byte[]转int
         * @param bytes
         * @return
         */
        public static int byteArrayToInt(byte[] bytes) {
               int value= 0;
               //由高位到低位
               for (int i = 0; i < 4; i++) {
                   int shift= (4 - 1 - i) * 8;
                   value +=(bytes[i] & 0x000000FF) << shift;//往高位游
               }
               return value;
         }
上边的方法适合从socket字节流中提取一部分字节来转为整数,但常用的String与int互转还有常用方法:
//字符串转整数
String str = "12345";

int num = Integer.valueOf(str).intValue();

//整数转字符串
int num = 12345;
String str = String.valueOf(num);
  评论这张
 
阅读(169)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017