[z]http://blog.csdn.net/xhyzdai/article/details/46684335

定义proto文件

  1. option java_package = "com.wy.web";
  2. message my_message{
  3. required string startedTime =1;
  4. required string version=2;
  5. required double configuredCapacity=3;
  6. required double dfsUsed =4;
  7. required int32 fileNum=5;
  8. required int32 replicatedFilesNum =6;
  9. required int32 blockNum =7;
  10. required int32 livedNodeNum =8;
  11. required int32 decommissioningNodeNum=9;
  12. }

生成proto文件对应的类

windows:

protoc.exe --java_out=.\ infor.proto(注意'\'和文件名之间有空格,c++命令为protoc.exe --java_out==.\ infor.proto)

Linux:

protoc -I=./ --java_out=./ infor.proto

c++代码,向java端发送数据

  1. #include <netinet/in.h>    // for sockaddr_in
  2. #include <sys/types.h>    // for socket
  3. #include <sys/socket.h>    // for socket
  4. #include <unistd.h>
  5. #include <stdio.h>        // for printf
  6. #include <stdlib.h>        // for exit
  7. #include <string.h>        // for bzero
  8. #include <string>
  9. #include <google/protobuf/message_lite.h>
  10. #include <google/protobuf/io/coded_stream.h>
  11. #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
  12. #include "infor.pb.h"
  13. #define HELLO_WORLD_SERVER_PORT    8000
  14. #define LENGTH_OF_LISTEN_QUEUE 20
  15. #define BUFFER_SIZE 1024
  16. #define FILE_NAME_MAX_SIZE 512
  17. int main()
  18. {
  19. std::string time = "2015-06-25";
  20. std::string version = "0.0.1";
  21. double config = 2.0;
  22. double dfs = 3.0;
  23. int file = 1000;
  24. int rep = 1000;
  25. int block = 1000;
  26. int live = 1000;
  27. int de = 1000;
  28. struct sockaddr_in server_addr;
  29. bzero(&server_addr,sizeof(server_addr));
  30. server_addr.sin_family = AF_INET;
  31. server_addr.sin_addr.s_addr = htons(INADDR_ANY);
  32. server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
  33. int server_socket = socket(PF_INET,SOCK_STREAM,0);
  34. if( server_socket < 0)
  35. {
  36. printf("Create Socket Failed!");
  37. exit(1);
  38. }
  39. int opt =1;
  40. setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  41. if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
  42. {
  43. printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
  44. exit(1);
  45. }
  46. if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
  47. {
  48. printf("Server Listen Failed!");
  49. exit(1);
  50. }
  51. while (1)
  52. {
  53. struct sockaddr_in client_addr;
  54. socklen_t length = sizeof(client_addr);
  55. int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
  56. if ( new_server_socket < 0)
  57. {
  58. printf("Server Accept Failed!\n");
  59. break;
  60. }
  61. my_message mm;
  62. mm.set_startedtime(time);
  63. mm.set_version(version);
  64. mm.set_configuredcapacity(config);
  65. mm.set_dfsused(dfs);
  66. mm.set_filenum(file);
  67. mm.set_replicatedfilesnum(rep);
  68. mm.set_blocknum(block);
  69. mm.set_livednodenum(live);
  70. mm.set_decommissioningnodenum(de);
  71. file += 1; rep += 1; block += 1; live += 1; de += 1;
  72. int len = mm.ByteSize() + 4;
  73. char *buffer = new char[len];
  74. google::protobuf::io::ArrayOutputStream arrayOut(buffer, len);
  75. google::protobuf::io::CodedOutputStream codedOut(&arrayOut);
  76. codedOut.WriteVarint32(mm.ByteSize());
  77. //write protobuf ack to buffer
  78. mm.SerializeToCodedStream(&codedOut);
  79. //mm.SerializeToArray(buffer, len);
  80. if(send(new_server_socket,buffer,len,0)<0)
  81. {
  82. printf("Send File:\t%s Failed\n", "ddddd");
  83. break;
  84. }
  85. close(new_server_socket);
  86. delete buffer;
  87. }
  88. close(server_socket);
  89. return 0;
  90. }

java接收线程,通过beancopy更新到数据中心

  1. package com.wy.web;
  2. import java.io.InputStream;
  3. import java.net.Socket;
  4. import java.net.UnknownHostException;
  5. import com.wy.util.BeanUtil;
  6. import com.wy.web.Infor.my_message;
  7. /**
  8. * 数据监听线程,从服务器端取得数据并更新到数据中心
  9. */
  10. public class dataListennerT extends Thread{
  11. private Socket socket;
  12. private DataCenter dataCenter;
  13. private static final String host="10.9.3.45";
  14. //private static final String host="10.9.3.165";
  15. public dataListennerT(DataCenter dataCenter) {
  16. this.dataCenter=dataCenter;
  17. }
  18. @Override
  19. public void run() {
  20. while(true)
  21. {
  22. try {
  23. Thread.sleep(1000);
  24. } catch (InterruptedException e1) {
  25. // TODO Auto-generated catch block
  26. e1.printStackTrace();
  27. }
  28. try {
  29. socket = new Socket(host,8000);
  30. System.out.println("成功连接");
  31. read(socket);
  32. } catch (UnknownHostException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. } catch (Exception e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. private void read(Socket socket) {
  42. InputStream clientIs;
  43. try {
  44. clientIs = socket.getInputStream();
  45. //Infor.my_message ms = Infor.my_message.parseDelimitedFrom(clientIs);
  46. /*-------------------------------*/
  47. byte[] arr = new byte[256];
  48. int len = clientIs.read(arr);
  49. byte[] data=new byte[len];
  50. for(int i=0;i<len;i++)
  51. data[i]=arr[i];
  52. Infor.my_message ms = Infor.my_message.parseFrom(data);
  53. System.out.println(ms.getStartedTime());
  54. //updataCenter(ms);
  55. BeanUtil.beanFieldCopy(ms, dataCenter, "Csi",true);
  56. } catch (Exception e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. }

数据中心

  1. package com.wy.web;
  2. import org.primefaces.push.annotation.Singleton;
  3. /**
  4. * 数据中心,从服务器取所有前台需要的数据
  5. */
  6. public class DataCenter {
  7. private static DataCenter instance;
  8. private String csiStartedTime = "20150624";
  9. private String csiVersion = "1.0.0";
  10. private double csiConfiguredCapacity = 1;
  11. private double csiDfsUsed = 1024;
  12. private int csiFileNum = 26;
  13. private int csiReplicatedFilesNum = 100;
  14. private int csiBlockNum;
  15. private int csiLivedNodeNum = 3;
  16. private int csiDecommissioningNodeNum = 0;
  17. public String getCsiStartedTime() {
  18. return csiStartedTime;
  19. }
  20. public void setCsiStartedTime(String csiStartedTime) {
  21. this.csiStartedTime = csiStartedTime;
  22. }
  23. public String getCsiVersion() {
  24. return csiVersion;
  25. }
  26. public void setCsiVersion(String csiVersion) {
  27. this.csiVersion = csiVersion;
  28. }
  29. public double getCsiConfiguredCapacity() {
  30. return csiConfiguredCapacity;
  31. }
  32. public void setCsiConfiguredCapacity(double csiConfiguredCapacity) {
  33. this.csiConfiguredCapacity = csiConfiguredCapacity;
  34. }
  35. public double getCsiDfsUsed() {
  36. return csiDfsUsed;
  37. }
  38. public void setCsiDfsUsed(double csiDfsUsed) {
  39. this.csiDfsUsed = csiDfsUsed;
  40. }
  41. public int getCsiFileNum() {
  42. return csiFileNum;
  43. }
  44. public void setCsiFileNum(int csiFileNum) {
  45. this.csiFileNum = csiFileNum;
  46. }
  47. public int getCsiReplicatedFilesNum() {
  48. return csiReplicatedFilesNum;
  49. }
  50. public void setCsiReplicatedFilesNum(int csiReplicatedFilesNum) {
  51. this.csiReplicatedFilesNum = csiReplicatedFilesNum;
  52. }
  53. public int getCsiLivedNodeNum() {
  54. return csiLivedNodeNum;
  55. }
  56. public void setCsiLivedNodeNum(int csiLivedNodeNum) {
  57. this.csiLivedNodeNum = csiLivedNodeNum;
  58. }
  59. public int getCsiDecommissioningNodeNum() {
  60. return csiDecommissioningNodeNum;
  61. }
  62. public void setCsiDecommissioningNodeNum(int csiDecommissioningNodeNum) {
  63. this.csiDecommissioningNodeNum = csiDecommissioningNodeNum;
  64. }
  65. public int getCsiBlockNum() {
  66. return csiBlockNum;
  67. }
  68. public void setCsiBlockNum(int blockNum) {
  69. this.csiBlockNum = blockNum;
  70. }
  71. public static DataCenter getClient() {
  72. if (instance == null) {
  73. synchronized (Singleton.class) {
  74. if (instance == null) {
  75. instance = new DataCenter();
  76. }
  77. }
  78. }
  79. return instance;
  80. }
  81. private DataCenter() {
  82. //System.out.println("DataCenter!!!==========");
  83. new dataListennerT(this).start();
  84. }
  85. }

bean copy,实现将两个类属性复制

    1. package com.wy.util;
    2. import java.lang.reflect.Field;
    3. import java.lang.reflect.Method;
    4. import java.util.HashSet;
    5. public class BeanUtil {
    6. public BeanUtil() {
    7. }
    8. public static synchronized void beanFieldCopy(Object src, Object des, String prefix,boolean desPrefix) {
    9. Class srcClass = src.getClass();
    10. Class desClass = des.getClass();
    11. HashSet<String> setFields = new HashSet<String>();
    12. Method[] srcMethods = srcClass.getMethods();
    13. Method[] desMethods = desClass.getMethods();
    14. //System.out.println(desClass.getName());
    15. // 保存提供set方法的参数
    16. for (int i = 0; i < desMethods.length; i++) {
    17. Method desMethod = desMethods[i];
    18. String desMethodName = desMethod.getName();
    19. if (desMethodName.startsWith("set"))
    20. {
    21. if(desPrefix)
    22. setFields.add(desMethodName.substring(3 + prefix.length(),
    23. desMethodName.length()));
    24. else
    25. setFields.add(desMethodName.substring(3,
    26. desMethodName.length()));
    27. }
    28. }
    29. //      if(desClass.getName().equals("com.wy.web.ClusterSummaryInfo"))
    30. //      System.out.println(setFields);
    31. // Field[] desFields = desClass.getDeclaredFields();
    32. for (int i = 0; i < srcMethods.length; i++) {
    33. Method method = srcMethods[i];
    34. String srcMethodName = method.getName();
    35. if (srcMethodName.startsWith("get")) {
    36. String fieldName;
    37. if(desPrefix)
    38. fieldName = srcMethodName.substring(3, srcMethodName.length());
    39. else
    40. fieldName=srcMethodName.substring(3+prefix.length(), srcMethodName.length());
    41. //              if(desClass.getName().equals("com.wy.web.ClusterSummaryInfo"))
    42. //              System.out.println(fieldName);
    43. if (setFields.contains(fieldName)) {
    44. String invokeMethodName;
    45. if(desPrefix)
    46. invokeMethodName= "set" + prefix + fieldName;
    47. else
    48. invokeMethodName="set"+fieldName;
    49. //System.out.println(desClass.getName()+"   "+invokeMethodName);
    50. try {
    51. Method invokeMethod = desClass.getMethod(
    52. invokeMethodName,
    53. new Class[] { method.getReturnType() });
    54. Object result = method.invoke(src, new Object[] {});
    55. if (result == null)
    56. break;
    57. invokeMethod.invoke(des, new Object[] { result });
    58. } catch (Exception e) {
    59. // TODO Auto-generated catch block
    60. e.printStackTrace();
    61. }
    62. }
    63. }
    64. }
    65. }
    66. }

[z]protobuf实现c++与java之间的数据传递,beancopy数据到前台的更多相关文章

  1. Activity之间使用intent传递大量数据带来问题总结

    转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405   Activity之间使用Parcel传递大量数据产生的问题. Activity ...

  2. Activity之间的数据传递

    最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...

  3. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  4. 序列化之protobuf与avro对比(Java)

    最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了pro ...

  5. C#和java之间的一些差异与共性

    C#与java之间的一些共性和差异整理 隐藏:与java中的重写几乎一致,但是需要添加new关键字让编译器知道,否则会有警告 虚方法:1.声明为virtual的方法就是虚方法,在子类中使用overri ...

  6. scala与java之间的那些事

    scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java. scala的设计者Martin Odersky就是一个JAVA控,这位牛人设计了javac和编写 ...

  7. Linux 环境下思源黑体字体与 Java 之间的兼容性问题的解决(补充说明)

    在前一篇随笔中,我讲了一下有关 Linux 环境下思源黑体与 Java 之间的兼容性问题,后来经过测试发现,默认安装的思源黑体字体同时包含简体字体和繁体字体,并且其对应的语言编码也是不同的.尝试着把繁 ...

  8. mysql/sql server和java之间的数据类型对应关系

    Mysql************************************当前列 ClassName ColumnType DisplaySize TypeName0: java.lang.I ...

  9. Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...

随机推荐

  1. webpack 自动发现 entry 的配置和引用方式

    假定我们的项目目录为如下的样子: - root/ - assets/ - app/ - global.js - index/ - index.js - auth/ - login.js - regis ...

  2. Android事件拦截机制 - 两句话

    模拟情形:ViewGroupA ->ViewGroupB->View False往下走,True就停下.(适用于事件传递和事件处理)

  3. splunk + docker-compose 实现自定义 index

    splunk是一款非常优秀的运维管理平台.Splunk 是机器数据的引擎.使用 Splunk 可收集.索引和利用所有应用程序.服务器和设备生成的快速移动型计算机数据 . 使用 Splunking 处理 ...

  4. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = { d: 40 }; var a = { x: 10, calculate: function (z) ...

  5. 吴裕雄 05-mysql删除数据库

    drop database <数据库名>; 例如删除名为 RUNOOB 的数据库:drop database RUNOOB; 使用 mysqladmin 删除数据库你也可以使用 mysql ...

  6. MongoDB用户名和密码

    在windows先进入MongoDB安装目录的bin目录下运行mongo.exe文件,会直接进入到MongoDB后台: 然后show dbs可以查看数据库: 比如你需要在admin数据库下面创建用户, ...

  7. R语言-画线图

    R语言分高水平作图函数和低水平作图函数 高水平作图函数:可以独立绘图,例如plot() 低水平作图函数:必须先运行高水平作图函数绘图,然后再加画在已有的图上面 第一种方法:plot()函数 > ...

  8. ETL工具总结

    ETL的考虑        做 数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒 还真的不少.但是那些工 ...

  9. 解决iframe在iphone不兼容的问题

    <div class="scroll-wrapper"> <iframe src="地址"></iframe> </d ...

  10. 配置linux的ip、网络等

      之前配过ubuntu的..以为centos的也是这么配置,结果照抄下来,启动报错哈哈...网上搜下资料发现centos配置需要不少文件.忘了以后再参考下- ubuntu的,这样配置 vim /et ...