使用 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格式的更多相关文章

  1. $.each遍历json对象(java将对象转化为json格式以及将json解析为普通对象)

    查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. var json = [ {"id":"1","tagName": ...

  2. ajax提交数据到java后台,并且返回json格式数据前台接收处理值

    1.前台html页面.有一段代码如下: 账  户:  <input type="text" name="userName" id="userN& ...

  3. java校验字符串是否为json格式

    觉得挺好玩的一个问题,如何校验字符串是否为标准的json格式,刚开始的回答是jsonObject或者jsonArray转换一下,如果可以转换,说明为json字符串,如果不能就抛出异常,捕获异常. 但是 ...

  4. Java入门系列:处理Json格式数据

    本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握 ...

  5. JAVA代码解析String字符串(json格式的)

    java解析String字符串(json格式) 需要jar包:json-lib-2.4-jdk15.jar 一. String str = "{\"name\":\&qu ...

  6. JAVA发送POST请求携带JSON格式字符串参数

    import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.htt ...

  7. 基于JDK6的JAX-WX为客户端提供XML与JSON格式数据服务,以及客户端采用AXIS调用案例

    1:WebService服务端工程目录如下: 需要第三方jar包:gson-2.2.4.jar\javax.xml.bind.jar\commons-lang-2.5.jar 源码如下: packag ...

  8. Java中将JSON格式的数据转换成对应的Bean、Map、List数据

    简单说明: 为了方便数据在客户端及服务器端的传输,有时候我们会用一些比较方便组织的数据类型,比如json.xml等传给客户端,客户端也可以重新组织数据传回服务器端.JSON和XML提供了一套比较方便的 ...

  9. 最好用的 Kafka Json Logger Java客户端,赶紧尝试一下

    最好用的 Kafka Json Logger Java客户端. slf4j4json 最好用的 Kafka Json Logger 库:不尝试一下可惜了! Description 一款为 Kafka ...

随机推荐

  1. 【转】越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用

    1.已经越狱的 iPhone.iPad 设备,当通过其自带的 safari 浏览器访问 ipa 应用下载网站时,利用 itms-services 协议,可以一键安装 ipa 文件的 iOS 应用,例如 ...

  2. 【转】Android Drawable Resource学习(十一)、RotateDrawable

    对另一个drawable资源,基于当前的level,进行旋转的drawable. 文件位置: res/drawable/filename.xml文件名即资源名 编译数据类型: 指向 RotateDra ...

  3. oracle 自定义异常处理

    --第一种方式:使用raise_application_error抛出自定义异常declare i number:=-1;begin if i=-1 then raise_application_er ...

  4. exp命令ORACLCE10G导出ORACLE11G的数据1455错误

    异常:1455 解决: 命令:exp youruser/password@192.xxx.x.xx:1521/orcl owner=youruser file=c:\export.dmp trigge ...

  5. [hadoop] hadoop “util.NativeCodeLoader: Unable to load native-hadoop library for your platform”

    执行 bin/hdfs dfs -mkdir /user,创建目录时出现警告信息. WARN util.NativeCodeLoader: Unable to load native-hadoop l ...

  6. 淘宝PHPSDK2.0 剔除 lotusphp框架---兄弟连教程

    淘宝PHPSDK2.0 剔除 lotusphp框架---兄弟连教程. lotusphp是一个国产开源的php框架 由于有个朋友公司是做淘宝客的,还由于不少朋友在开淘宝,于是有必要研究下.尽管个人认为微 ...

  7. Javascript跨域问题解决方案

    ---本方法来自网上,因最近项目需求,解决了三天未果,最终发现此文并测试可用. 一个 非常优雅绝妙的解决方案!话不多说,直接上解决方案原理图: 该图要解决的问题说明如下:在AAA.com域名下的ind ...

  8. js禁止从浏览器缓存读取消息

    $.ajaxSetup ({ cache: false //设置成false将不会从浏览器缓存读取信息 });

  9. mui中的关闭页面的几种方法

    一.总结: mui中关闭当前页面的几种方式: 1.swipeBack(暂未测试过) 2.keyEventBind(暂未测试过) 3.给标签的class加.mui-action-back(返回的是前一个 ...

  10. linux下查看进程运行的时间

    原文链接:http://www.centoscn.com/CentOS/2014/0403/2724.html 可通过ps 来查看,通过参数 -o 来查看 例: ps -eo pid,tty,user ...