定义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 buffer -
mm.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; -
} -
@Override -
public void run() { -
while(true) -
{ -
try { -
Thread.sleep(1000); -
} catch (InterruptedException e1) { -
// TODO Auto-generated catch block -
e1.printStackTrace(); -
} -
try { -
socket = new Socket(host,8000); -
System.out.println("成功连接"); -
read(socket); -
} catch (UnknownHostException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (Exception e) { -
// TODO Auto-generated catch block -
e.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 block -
e.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())); -
else -
setFields.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()); -
else -
fieldName=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; -
else -
invokeMethodName="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 block -
e.printStackTrace(); -
} -
} -
} -
} -
} -
}
--------------------- 本文来自 chicc999 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/chicc999/article/details/46687291?utm_source=copy
本文详细介绍了如何定义Proto文件以实现跨语言的数据结构定义,并提供了C++向Java端发送数据的具体代码实例,同时展示了Java端如何通过BeanCopy更新数据中心的过程。

918

被折叠的 条评论
为什么被折叠?



