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 ...
随机推荐
- swagger-editor 快速REST-API 测试文档编写
1. 在线使用 http://editor.swagger.io/#/ 2. 离线工具 https://github.com/swagger-api/swagger-editor 3. 跨域访问问题: ...
- caller 属性和callee属性
1.caller 属性 返回一个对函数的引用,即调用了当前函数的函数体. functionName.caller :functionName 对象是所执行函数的名称. 说明: 对于函数来说,calle ...
- 微信公众号开发笔记(C#)
这篇文章还不错,使用 .net , 对微信用户的想公众号发送的文字进行回复.比较简单,自己可以修改更复杂的回复. 微信公众号开发笔记(C#) 原文地址 需求分析 根据用户在微信上发送至价值中国公众号 ...
- apache 2.4 配置多个站点
1.打开\Apache24\conf\httpd.conf 查找conf/extra/httpd-vhosts.conf 去掉前面的#号,一般是去掉的 2.在httpd.conf 中查找Requir ...
- synergy帮组提升办公效率
这个synergy确实很不错哦,当你在办公室拥有两台或者多台电脑的时候,放在面前多台显示器,多个鼠标,多个键盘,但是你的桌面上,是不是多出了些你不需要看到的键盘或者鼠标?至少我是这样子的,我希望多个显 ...
- 【shell】通配符
‘’与“” [root@andon ~]# name='$date' [root@andon ~]# echo $name $date [root@andon ~]# name=abc [root@a ...
- 【python】浅谈enumerate 函数
enumerate 函数用于遍历序列中的元素以及它们的坐标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a 1 b ...
- php 安装shpinx扩展
cd /home/packages wget http://sphinxsearch.com/files/sphinx-0.9.9.tar.gz tar xzvf sphinx-0.9.9.tar.g ...
- SSH_框架整合7--整个项目CODE
一 架构 1Action类 2 配置文件 3 View页面 二 Code 1 src (1)com.atguigu.ssh.actions >EmployeeAction.java packa ...
- 【LVM】LVM自动扩容脚本
概要说明: /dev/mapper/vg0-data挂载在目录/data下: 当新增物理磁盘时,需要自动对/dev/mapper/vg0-data磁盘时进行扩容(自动化脚本): 当新增物理磁盘时,自动 ...