gRPC java 客户端,服务器端通讯使用json格式
使用 protobuf 作为通讯内容序列化的简单例子请看:http://www.cnblogs.com/ghj1976/p/5458176.html 。
本文是使用 json 做为内容序列化的简单例子。
新建例子项目,从 proto 文件产生 通讯包的方式跟之前的完全一样。
本文的源码在:
https://github.com/grpc/grpc-java/tree/master/examples/src/main/java/io/grpc/examples/helloworld 这里的
HelloJsonServer.java 和 HelloJsonClient.java 这两个文件中。
这个文件跟 protobuf 处理的文件不同的地方如下:
定义一个JSON解析的Stub
整个类的定义文件如下:
package com.ghj1976;
import io.grpc.examples.helloworld.GreeterGrpc;
import io.grpc.examples.helloworld.HelloReply;
import io.grpc.examples.helloworld.HelloRequest;
import io.grpc.stub.AbstractStub;
import static io.grpc.stub.ClientCalls.blockingUnaryCall;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.MethodDescriptor;
import io.grpc.protobuf.ProtoUtils;
/**
* Created by ghj1976 on 16/5/4.
*/
public class HelloWorldJSONStub extends AbstractStub<HelloWorldJSONStub>
implements io.grpc.examples.helloworld.GreeterGrpc.GreeterBlockingClient {
static final MethodDescriptor<HelloRequest, HelloReply> METHOD_SAY_HELLO =
MethodDescriptor.create(
GreeterGrpc.METHOD_SAY_HELLO.getType(),
GreeterGrpc.METHOD_SAY_HELLO.getFullMethodName(),
ProtoUtils.jsonMarshaller(HelloRequest.getDefaultInstance()),
ProtoUtils.jsonMarshaller(HelloReply.getDefaultInstance()));
protected HelloWorldJSONStub(Channel channel) {
super(channel);
}
protected HelloWorldJSONStub(Channel channel, CallOptions callOptions) {
super(channel, callOptions);
}
@Override
protected HelloWorldJSONStub build(Channel channel, CallOptions callOptions) {
return new HelloWorldJSONStub(channel, callOptions);
}
@Override
public HelloReply sayHello(HelloRequest request) {
return blockingUnaryCall(
getChannel(), METHOD_SAY_HELLO, getCallOptions(), request);
}
}
具体的解析用的 ProtoUtils.jsonMarshaller() 这个函数。
服务器端的修改
服务器端代码封装个函数, bindService, 用于服务器的数据解析分层。
private ServerServiceDefinition bindService(final GreeterGrpc.Greeter serviceImpl){
return io.grpc.ServerServiceDefinition.builder(GreeterGrpc.SERVICE_NAME)
.addMethod(
com.ghj1976.HelloWorldJSONStub.METHOD_SAY_HELLO,
asyncUnaryCall(
new ServerCalls.UnaryMethod<HelloRequest,HelloReply>(){
@Override
public void invoke(HelloRequest request,StreamObserver<HelloReply> responseObserver){
serviceImpl.sayHello(request,responseObserver);
}
}
))
.build();
}
这里用到了我们前面定义的方法
com.ghj1976.HelloWorldJSONStub.METHOD_SAY_HELLO,
增加服务时用这个 bindService 做封装。

服务端的代码改造就这些。
客户端的代码改造
只需要修改 Stub 为我们刚刚建立的 HelloWorldJSONStub 接口。

执行方法跟之前完全一样, 启动 main 方法即可。
使用 Wireshark 监听网络请求,可以看到这时候发送的数据包:
客户端请求的数据包:

服务器端返回的包:

使用 protobuf 时,则会是如下的截图:


gRPC java 客户端,服务器端通讯使用json格式的更多相关文章
- $.each遍历json对象(java将对象转化为json格式以及将json解析为普通对象)
查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. var json = [ {"id":"1","tagName": ...
- ajax提交数据到java后台,并且返回json格式数据前台接收处理值
1.前台html页面.有一段代码如下: 账 户: <input type="text" name="userName" id="userN& ...
- java校验字符串是否为json格式
觉得挺好玩的一个问题,如何校验字符串是否为标准的json格式,刚开始的回答是jsonObject或者jsonArray转换一下,如果可以转换,说明为json字符串,如果不能就抛出异常,捕获异常. 但是 ...
- Java入门系列:处理Json格式数据
本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握 ...
- JAVA代码解析String字符串(json格式的)
java解析String字符串(json格式) 需要jar包:json-lib-2.4-jdk15.jar 一. String str = "{\"name\":\&qu ...
- JAVA发送POST请求携带JSON格式字符串参数
import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.htt ...
- 基于JDK6的JAX-WX为客户端提供XML与JSON格式数据服务,以及客户端采用AXIS调用案例
1:WebService服务端工程目录如下: 需要第三方jar包:gson-2.2.4.jar\javax.xml.bind.jar\commons-lang-2.5.jar 源码如下: packag ...
- Java中将JSON格式的数据转换成对应的Bean、Map、List数据
简单说明: 为了方便数据在客户端及服务器端的传输,有时候我们会用一些比较方便组织的数据类型,比如json.xml等传给客户端,客户端也可以重新组织数据传回服务器端.JSON和XML提供了一套比较方便的 ...
- 最好用的 Kafka Json Logger Java客户端,赶紧尝试一下
最好用的 Kafka Json Logger Java客户端. slf4j4json 最好用的 Kafka Json Logger 库:不尝试一下可惜了! Description 一款为 Kafka ...
随机推荐
- 【转】VS2012程序打包部署详解
上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...
- 【转】windows7的桌面右键菜单的“新建”子菜单,在注册表哪个位置,如何在“新建"里面添加一个新项
点击桌面,就会弹出菜单,然后在“新建”中就又弹出可以新建的子菜单栏.office与txt 的新建都是在这里面的.我想做的事情是:在右键菜单的“新建” 中添加一个“TQ文本”的新建项,然后点击它之后,桌 ...
- C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...
- jquery读取csv文件并用json格式输出
直接贴上代码: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untit ...
- Spring实战6:利用Spring和JDBC访问数据库
主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...
- Bind 跨域名别名解析的问题
我有一个域名 aaa.net 已经生效 ,并且下面有 xx的 A记录:现在我还有一个 aaa.com域名 ,我想用 别名方式把它下面 某个 记录以别名方式解析到 xx.aaa.net上去.应该在aaa ...
- TMDS协议
1 概述 1.1 连接结构 图1 TMDS连接结构 数据流中包含了像素和控制数据,发送器在任何给定的输入时钟周期,到底是编码像素数据还是控制数据取决于数据使能信号DE,DE有效时,指示像素数 据 ...
- [linux basic基础]----套接字
套接字是一种通信机制,凭借这种机制client/server系统的开发者既可以在本地机器上进行,也可以跨网络进行. 1,服务器应用程序用系统调用socket来创建一个套接字,他是系统分配给服务器进程的 ...
- windows下boost库的基本使用方法
因为boost都是使用模板的技术,所以所有代码都是写在一个.hpp头文件中.这样boost中的大部分内容是不需要编译生成相应的链接库,只需要设置下面的包含目录(或者设置一下环境变量),在源文件中包含相 ...
- [物理学与PDEs]书中出现的符号及其意义汇总
1. 标量 $\ve_0$: $=8.85419\times 10^{-2}C^2/(N\cdot m^2)$ 真空中的介电常数 $\ve$: 介电常数 $\ve_r$: $=1+\chi_e$ 相对 ...