java json客户端_gRPC java 客户端,服务器端通讯使用json格式

本文是使用 json 做为内容序列化的简单例子。

新建例子项目,从 proto 文件产生 通讯包的方式跟之前的完全一样。

本文的源码在:

这个文件跟 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

implements io.grpc.examples.helloworld.GreeterGrpc.GreeterBlockingClient {

static final MethodDescriptor 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(){

@Override

public void invoke(HelloRequest request,StreamObserver responseObserver){

serviceImpl.sayHello(request,responseObserver);

}

}

))

.build();

}

这里用到了我们前面定义的方法

com.ghj1976.HelloWorldJSONStub.METHOD_SAY_HELLO,

增加服务时用这个 bindService 做封装。

f7d09e270c99b82d47901aa2ab146f09.png

服务端的代码改造就这些。

客户端的代码改造

只需要修改 Stub 为我们刚刚建立的 HelloWorldJSONStub  接口。

939b7e43cd529d839dee262941bb1e92.png

执行方法跟之前完全一样, 启动 main 方法即可。

使用 Wireshark 监听网络请求,可以看到这时候发送的数据包:

客户端请求的数据包:

8e31f955b41af0f4be2993bf2e8068f8.png

服务器端返回的包:

4bdab79e901a4361362f9c4a4cf41bd7.png

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

03dccb9ee6c7f51707fd9896b5f73580.png

690a1ec5725a269d2ed1ffdcd838b31e.png

原文:http://www.cnblogs.com/ghj1976/p/5462071.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值