protobuf实现c++与java之间的数据传递,beancopy数据到前台

来源:互联网 发布:淘宝客服自我简介 编辑:程序博客网 时间:2024/05/07 11:02

定义proto文件

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


生成proto文件对应的类

windows:

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

linux:

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


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

#include <netinet/in.h>    // for sockaddr_in#include <sys/types.h>    // for socket#include <sys/socket.h>    // for socket#include <unistd.h>#include <stdio.h>        // for printf#include <stdlib.h>        // for exit#include <string.h>        // for bzero#include <string>#include <google/protobuf/message_lite.h>#include <google/protobuf/io/coded_stream.h>#include <google/protobuf/io/zero_copy_stream_impl_lite.h>#include "infor.pb.h"#define HELLO_WORLD_SERVER_PORT    8000 #define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512 int main(){    std::string time = "2015-06-25";    std::string version = "0.0.1";    double config = 2.0;    double dfs = 3.0;    int file = 1000;    int rep = 1000;    int block = 1000;    int live = 1000;    int de = 1000;    struct sockaddr_in server_addr;    bzero(&server_addr,sizeof(server_addr));     server_addr.sin_family = AF_INET;    server_addr.sin_addr.s_addr = htons(INADDR_ANY);    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);     int server_socket = socket(PF_INET,SOCK_STREAM,0);    if( server_socket < 0)    {        printf("Create Socket Failed!");        exit(1);    }   int opt =1;   setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));         if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))    {        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);         exit(1);    }     if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )    {        printf("Server Listen Failed!");         exit(1);    }    while (1)     {        struct sockaddr_in client_addr;        socklen_t length = sizeof(client_addr);         int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);        if ( new_server_socket < 0)        {            printf("Server Accept Failed!\n");            break;        }                       my_message mm;        mm.set_startedtime(time);        mm.set_version(version);        mm.set_configuredcapacity(config);        mm.set_dfsused(dfs);        mm.set_filenum(file);        mm.set_replicatedfilesnum(rep);        mm.set_blocknum(block);        mm.set_livednodenum(live);        mm.set_decommissioningnodenum(de);file += 1; rep += 1; block += 1; live += 1; de += 1;                int len = mm.ByteSize() + 4;char *buffer = new char[len];google::protobuf::io::ArrayOutputStream arrayOut(buffer, len);google::protobuf::io::CodedOutputStream codedOut(&arrayOut);codedOut.WriteVarint32(mm.ByteSize());//write protobuf ack to buffermm.SerializeToCodedStream(&codedOut);        //mm.SerializeToArray(buffer, len);                if(send(new_server_socket,buffer,len,0)<0)        {            printf("Send File:\t%s Failed\n", "ddddd");            break;        }        close(new_server_socket);delete buffer;    }    close(server_socket);    return 0;}

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

package com.wy.web;import java.io.InputStream;import java.net.Socket;import java.net.UnknownHostException;import com.wy.util.BeanUtil;import com.wy.web.Infor.my_message;/** * 数据监听线程,从服务器端取得数据并更新到数据中心 */public class dataListennerT extends Thread{private Socket socket;private DataCenter dataCenter;private static final String host="10.9.3.45";//private static final String host="10.9.3.165";public dataListennerT(DataCenter dataCenter) {this.dataCenter=dataCenter;}@Overridepublic void run() {while(true){try {Thread.sleep(1000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}try {socket = new Socket(host,8000);System.out.println("成功连接");read(socket);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private void read(Socket socket) {InputStream clientIs;try {clientIs = socket.getInputStream();//Infor.my_message ms = Infor.my_message.parseDelimitedFrom(clientIs);/*-------------------------------*/byte[] arr = new byte[256];        int len = clientIs.read(arr);        byte[] data=new byte[len];        for(int i=0;i<len;i++)        data[i]=arr[i];                        Infor.my_message ms = Infor.my_message.parseFrom(data);System.out.println(ms.getStartedTime());//updataCenter(ms);BeanUtil.beanFieldCopy(ms, dataCenter, "Csi",true);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
数据中心

package com.wy.web;import org.primefaces.push.annotation.Singleton;/** * 数据中心,从服务器取所有前台需要的数据 */public class DataCenter {private static DataCenter instance;private String csiStartedTime = "20150624";private String csiVersion = "1.0.0";private double csiConfiguredCapacity = 1;private double csiDfsUsed = 1024;private int csiFileNum = 26;private int csiReplicatedFilesNum = 100;private int csiBlockNum;private int csiLivedNodeNum = 3;private int csiDecommissioningNodeNum = 0;public String getCsiStartedTime() {return csiStartedTime;}public void setCsiStartedTime(String csiStartedTime) {this.csiStartedTime = csiStartedTime;}public String getCsiVersion() {return csiVersion;}public void setCsiVersion(String csiVersion) {this.csiVersion = csiVersion;}public double getCsiConfiguredCapacity() {return csiConfiguredCapacity;}public void setCsiConfiguredCapacity(double csiConfiguredCapacity) {this.csiConfiguredCapacity = csiConfiguredCapacity;}public double getCsiDfsUsed() {return csiDfsUsed;}public void setCsiDfsUsed(double csiDfsUsed) {this.csiDfsUsed = csiDfsUsed;}public int getCsiFileNum() {return csiFileNum;}public void setCsiFileNum(int csiFileNum) {this.csiFileNum = csiFileNum;}public int getCsiReplicatedFilesNum() {return csiReplicatedFilesNum;}public void setCsiReplicatedFilesNum(int csiReplicatedFilesNum) {this.csiReplicatedFilesNum = csiReplicatedFilesNum;}public int getCsiLivedNodeNum() {return csiLivedNodeNum;}public void setCsiLivedNodeNum(int csiLivedNodeNum) {this.csiLivedNodeNum = csiLivedNodeNum;}public int getCsiDecommissioningNodeNum() {return csiDecommissioningNodeNum;}public void setCsiDecommissioningNodeNum(int csiDecommissioningNodeNum) {this.csiDecommissioningNodeNum = csiDecommissioningNodeNum;}public int getCsiBlockNum() {return csiBlockNum;}public void setCsiBlockNum(int blockNum) {this.csiBlockNum = blockNum;}public static DataCenter getClient() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new DataCenter();}}}return instance;}private DataCenter() {//System.out.println("DataCenter!!!==========");new dataListennerT(this).start();}}

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

package com.wy.util;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashSet;public class BeanUtil {public BeanUtil() {}public static synchronized void beanFieldCopy(Object src, Object des, String prefix,boolean desPrefix) {Class srcClass = src.getClass();Class desClass = des.getClass();HashSet<String> setFields = new HashSet<String>();Method[] srcMethods = srcClass.getMethods();Method[] desMethods = desClass.getMethods();  //System.out.println(desClass.getName());// 保存提供set方法的参数for (int i = 0; i < desMethods.length; i++) {Method desMethod = desMethods[i];String desMethodName = desMethod.getName();if (desMethodName.startsWith("set")){if(desPrefix)setFields.add(desMethodName.substring(3 + prefix.length(),desMethodName.length()));elsesetFields.add(desMethodName.substring(3,desMethodName.length()));}}//if(desClass.getName().equals("com.wy.web.ClusterSummaryInfo"))//System.out.println(setFields);// Field[] desFields = desClass.getDeclaredFields();for (int i = 0; i < srcMethods.length; i++) {Method method = srcMethods[i];String srcMethodName = method.getName();if (srcMethodName.startsWith("get")) {String fieldName;if(desPrefix)fieldName = srcMethodName.substring(3, srcMethodName.length());elsefieldName=srcMethodName.substring(3+prefix.length(), srcMethodName.length());//if(desClass.getName().equals("com.wy.web.ClusterSummaryInfo"))//System.out.println(fieldName);if (setFields.contains(fieldName)) {String invokeMethodName;if(desPrefix)invokeMethodName= "set" + prefix + fieldName;elseinvokeMethodName="set"+fieldName;//System.out.println(desClass.getName()+"   "+invokeMethodName);try {Method invokeMethod = desClass.getMethod(invokeMethodName,new Class[] { method.getReturnType() });Object result = method.invoke(src, new Object[] {});if (result == null)break;invokeMethod.invoke(des, new Object[] { result });} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}}



0 0
原创粉丝点击