首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

gRPC Java server:有没有办法获取从客户端接收到的原始消息字节?

gRPC Java server是一个用于构建高性能、可扩展和跨平台的分布式系统的开源框架。它基于Google的Protocol Buffers(protobuf)和HTTP/2协议,提供了一种简单且高效的方法来定义服务和生成客户端和服务器端的代码。

在gRPC Java server中,可以通过自定义拦截器来获取从客户端接收到的原始消息字节。拦截器是一种机制,允许开发人员在请求和响应之间进行处理和修改。

要获取原始消息字节,可以实现gRPC的ServerInterceptor接口,并重写interceptCall()方法。在该方法中,可以通过ServerCall.ListeneronMessage()方法获取到从客户端接收到的消息对象,然后使用Message.toByteArray()方法将消息对象转换为字节数组。

以下是一个示例代码:

代码语言:txt
复制
import io.grpc.*;

public class RawMessageInterceptor implements ServerInterceptor {
    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
        ServerCall<ReqT, RespT> wrappedCall = new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {
            @Override
            public void sendMessage(RespT message) {
                // 在发送响应消息之前的处理
                super.sendMessage(message);
            }

            @Override
            public void request(int numMessages) {
                // 在接收请求消息之前的处理
                super.request(numMessages);
            }

            @Override
            public void close(Status status, Metadata trailers) {
                // 在关闭调用之前的处理
                super.close(status, trailers);
            }
        };

        ServerCall.Listener<ReqT> wrappedListener = new ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(next.startCall(wrappedCall, headers)) {
            @Override
            public void onMessage(ReqT message) {
                // 在接收到请求消息时的处理
                if (message instanceof com.google.protobuf.Message) {
                    byte[] rawBytes = ((com.google.protobuf.Message) message).toByteArray();
                    // 处理原始消息字节
                }
                super.onMessage(message);
            }
        };

        return wrappedListener;
    }
}

在上述代码中,RawMessageInterceptor实现了ServerInterceptor接口,并重写了interceptCall()方法。在onMessage()方法中,可以通过判断消息对象是否为com.google.protobuf.Message类型,然后使用toByteArray()方法获取原始消息字节。

使用该拦截器时,可以在创建gRPC服务器时将其添加到ServerBuilder中,如下所示:

代码语言:txt
复制
Server server = ServerBuilder.forPort(8080)
        .addService(ServerInterceptors.intercept(new YourService(), new RawMessageInterceptor()))
        .build()
        .start();

这样,当客户端发送请求时,服务器将能够获取到原始消息字节,并进行相应的处理。

对于gRPC Java server的更多信息和使用方法,可以参考腾讯云的相关产品和文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RPC、gRPC常见面试题及相关知识点

(4)服务端存根通过网络接收到消息,按照相应格式进行拆包、解码,获取方法名和参数。 (5)服务端存根根据方法名和参数进行本地调用,这时调用是真正服务提供者。...(4)客户端接收到服务端响应结果,解码请求体,回调被调用方法,唤醒正在等待响应(阻塞)客户端调用并返回响应结果。 gRPC特性如下。 (1)语言中立,支持多种语言。...(2)将需要调用服务端接口实现类注册到内部Registry中,当客户端发起 RPC调用时,可以根据RPC请求消息服务定义信息查询到服务接口实现类。 (3)创建gRPC Server。...gRPC ServergRPC服务端抽象,聚合了各种Listener,用于RPC消息统一调度和处理。...gRPC Server在接收到gRPC请求消息后会先对gRPC消息头和消息体进行解析和处理,然后经过内部服务路由和调用,最后返回响应消息。 内容摘自《Offer来了(第2版)》。

2.4K30

聊聊高性能 RPC框架 gRPC

stub接收到调用后负责将方法、参数等组装成能够进行网络传输消息体; client stub找到服务地址,并将消息发送到服务端; server stub收到消息后进行解码; server stub根据解码结果调用本地服务...; 本地服务执行并将结果返回给 server stub; server stub将返回结果打包成消息并发送至消费方; client stub接收到消息,并进行解码; 服务消费方得到最终结果。...,通过 proto3 工具生成指定语言数据结构、服务端接口以及客户端 Stub; 通信协议基于标准 HTTP/2 设计,支持双向流、消息头压缩、单 TCP 多路复用、服务端推送等特性,这些特性使得...Buffers 进行编写 proto 文件,交换机与服务器建立 gRPC 通道,通过 gRPC 协议向服务器发送请求消息; 服务器收到请求消息后,服务器会通过 Protocol Buffers 解译...proto 文件,还原出最先定义好格式数据结构,进行业务处理; 数据处理完后,服务器需要使用 Protocol Buffers 重编译应答数据,通过 gRPC 协议向交换机发送应答消息; 交换机收到应答消息

1.4K40

RPC原理及实现

RPC 服务端接收器 RpcAcceptor 接收客户调用请求,同样使用 RpcProtocol 执行协议解码(decode)。...grpc(开源)、Twitterfinagle等。...; 4)server stub收到消息后进行解码; 5)server stub根据解码结果调用本地服务; 6)本地服务执行并将结果返回给server stub; 7)server stub将返回结果打包成消息并发送至消费方...6.4 消息里为什么要带有requestID 如果使用netty的话,一般会用channel.writeAndFlush()方法来发送消息二进制串,这个方法调用后对于整个远程调用(发出请求到接收到结果...4)服务端接收到请求并处理后,将response结果(此结果中包含了前面的requestID)发送给客户端,客户端socket连接上专门监听消息线程收到消息,分析结果,取到requestID,再从前面的

2.7K90

BIO在聊天室项目中演化

# 提要: 第一版: echo聊天室 服务器接收到客户端发送消息,并打印 服务端将客户端发送消息经过包装后再次发送给客户客户端断开连接 eg: client: greet from socket.... server: echo from server: 第二版: 群聊聊天室 服务器接收客户端发送消息,并打印 服务端将客户端发送消息转发给其他在线客户端...from socket.> 实现思路: 创建服务端ServerSocket并绑定所监听端口 调用serverSocket.accept()阻塞监听客户接入 客户端接入后获取客户端Socket,...测试 启动服务端 分别启动两个客户端,向服务端发送消息 两个客户端分别发送了一条消息,并接收到了服务器响应。...通过约定符号 先在输出流第一个字节写入本次传输将会传递数据字节大小,接收方在获取到这个值之后,输入流中读取指定个数字节即可。

45410

RPC框架:原理到选型,一文带你搞懂RPC

stub接收到调用后负责将方法、参数等组装成能够进行网络传输消息体; client stub找到服务地址,并将消息发送到服务端; server stub收到消息后进行解码; server stub根据解码结果调用本地服务...; 本地服务执行并将结果返回给server stub; server stub将返回结果打包成消息并发送至消费方; client stub接收到消息,并进行解码; 服务消费方得到最终结果。...对java来说就是使用代理!java代理有两种方式:1) jdk 动态代理;2)字节码生成。...如何发布自己服务 这个我前面的很多文章都提到过,Java常用zookeeper,Go常用ETCD,服务端进行注册和心跳,客户获取机器列表,没啥高深,比如zookeeper: gRPC & Thrift...,进行业务处理; 数据处理完后,服务器需要使用Protocol Buffers重编译应答数据,通过gRPC协议向交换机发送应答消息; 交换机收到应答消息后,结束本次gRPC交互。

22.9K812

不懂RPC,休谈微服务

server stub收到消息后进行解码; server stub根据解码结果调用本地服务; 本地服务执行并将结果返回给server stub; server stub将返回结果打包成消息并发送至消费方...java代理有两种方式: jdk 动态代理 字节码生成 (关于动态代理,可以看下沉思君之前写过文章:聊聊Java动态代理(上)和聊聊Java动态代理(下)) 尽管字节码生成方式实现代理更为强大和高效...如果使用netty的话,一般会用channel.writeAndFlush()方法来发送消息二进制串,这个方法调用后对于整个远程调用(发出请求到接收到结果)来说是一个异步,即对于当前线程来说,将请求发送出来后...,client收到很多消息,怎么知道哪个消息结果是原先哪个线程调用?...服务端接收到请求并处理后,将response结果(此结果中包含了前面的requestID)发送给客户端,客户端socket连接上专门监听消息线程收到消息,分析结果,取到requestID,再从前面的ConcurrentHashMap

65020

websocket协议

,它请求步骤为: 浏览器与服务器建立tcp协议 浏览器发送请求 服务端接收请求,回复消息 浏览器接收消息 tcp连接关闭 http协议特点就是即连即关,每次接收到消息就关闭连接,并且需要浏览器主动请求服务器才能获取消息...举个例子,在聊天室需求中,A和B互相通信实现: A不断请求服务器,B有没有给我发送消息(主动请求服务器,询问有没有消息) B不断请求服务器,A有没有给我发送消息(主动请求服务器,询问有没有消息...在这个例子中,我们发现,A和B如果需要获取到对方是否有没有发送消息,必须不断请求服务器,主动询问服务器是否有消息. 那么,不断间隔是多少呢?1秒10次?10秒一次?...1秒10次不断请求服务器,服务器能承受住吗?10秒一次?那A发送一条消息,B就得10秒后才能收到,消息延时太过于厉害. 那么,有没有办法,使得服务器主动给浏览器发消息呢?...服务端如果支持websocket,将会给客户端返回(升级成功),如果不支持,则会输出正常http数据 客户端接收服务端返回消息,如果支持,则连接保持,不支持则报错并断开 连接保持,这时候,客户端和服务端即可互相发消息

2.3K20

TCP和UDP详解

消息将以服务器端发出同样顺序发送到客户端,尽管这些消息到网络另一端时可能是无序。 TCP协议将会为你排好序。 UDP不提供任何有序性或序列性保证。...客户视角来看,我接到了服务端发送过来响应数据包,说明服务端接收到了我在第一次握手时发送网络包,并且成功发送了响应数据包,这就说明,服务端接收、发送能力正常。...而在第三次握手时,服务端收到客户端对第二次握手作回应。服务端角度,我在第二次握手时响应数据发送出去了,客户端接收到了。所以,我发送能力是正常。而客户接收能力也是正常。...比如第三次握手时,服务端收到数据包,表明看服务端只能得到客户发送能力、服务端接收能力是正常,但是结合第二次,说明服务端在第二次发送响应包,客户端接收到了,并且作出了响应,从而得到额外结论:客户接收...实际上,为了避免此问题产生,发送端主机会时不时发送一个叫做窗口探测数据段,此数据段仅包含一个字节获取最新窗口大小信息。

75520

NewLife.Net——管道处理器解决粘包

Tcp网络编程,必须要解决一个问题就是粘包,尽管解决办法有很多,这里讲一个比较简单方法。...粘包解决办法很多,一般是加头部长度或者分隔符,也有取巧办法直接设置NoDelay。 使用上来讲,相对可靠做法是加头部长度。...编码器顺序非常重要,网络层收到数据包以后,会从前向后走过每一个处理器;SendAsync/SendMessage发送消息时,会后向前走过每一个过滤器,逆序。...客户端接收时,e.Message表示经过处理器处理得到消息,e.Packet表示原始数据包。 同时,通过LogSend/LogReceive打开收发数据日志。 ?...上图效果,客户端发出第5个包,头部多了4个字节,其中07-00表示后续负载数据长度为7字节(NewLife)。 服务端先收到第一个包11字节,然后收到44字节,这是4个包粘在一起。

60430

go grpc: connection reset by peer 一种解决方案

grpc server keepalive配置 原始配置 var keepAliveArgs = keepalive.ServerParameters{ Time: 60 * time.Second...原因分析 为了弄清keepalive逻辑,查看源码grpc/internal/transport/http2_server.go grpc ping发包逻辑 每隔预设时间,就会发一个包。...预期外断联原因 可能是因为网络抖动或者grpc server忙不过来,使得某次ping包被丢弃或未及时处理。造成了连接被错误切断。 解决 一开始,想要找一找有没有retry之类配置。...: 90 * time.Second, } 在这个配置下,为ping之后给了更长反应时间,根据grpc源码,90秒内如果有任意数据被接收(包含收到客户端发来消息)。...但假如客户端一直没有数据回发,猜想应该还是会把连接切断。因为ping在没有收到消息时候不会再进行下一次ping。

2.2K20

分布式服务框架gRPC

因此,例如,您可以使用Go,Python或Ruby客户端轻松地用Java创建 gRPC服务器。...访问类为每个字段提供了简单访问器(例如 name())和 set_name()),以及将整个结构序列化为原始字节原始字节中解析出整个结构方法-例如,如果您选择语言是C ++,则在上面的示例将生成一个名为...rpc SayHello(HelloRequest) returns (HelloResponse){} 服务器流式RPC,客户端向服务器发送请求,并获取流以读取回一系列消息。...客户返回流中读取,直到没有更多消息为止。gRPC保证单个RPC调用中消息顺序。...因此,例如,服务器可以等到收到所有客户消息后再写响应,或者服务器和客户端可以玩“乒乓”:服务器收到请求,然后发回响应,然后客户端发送基于响应另一个请求,依此类推。

1.8K30

深入浅出gRPC概念与原理

: Service:提供服务 Client:gRPC客户gRPC ServergRPC服务端接gRPC Stub:gRPC客户端接口 Proto Request/Proto Response...这些为每个字段提供了简单访问器,例如name()and set_name(),以及将整个结构序列化/解析到原始字节方法。...使用protoc特殊 gRPC 插件 proto 文件生成代码:将获得生成 gRPC 客户端和服务器代码,以及用于填充、序列化和检索消息类型常规协议缓冲区代码。...rpc SayHello(HelloRequest) returns (HelloResponse); 3.2 Server streaming RPC 服务器流式 RPC,其中客户端向服务器发送请求并获取流以读回一系列消息...客户返回流中读取,直到没有更多消息为止。gRPC 保证单个 RPC 调用中消息顺序。

2.6K20

RPC简介和grpc使用

RPC 让程序之间远程过程调用具有与本地调用类似的形式。比如说某个程序需要读取某个文件数据,开发人员会在代码中执行 read 系统调用来获取数据。    ...不同是它底层实现上不是进行操作系统调用读取本地文件来提供数据,而是将参数打包成网络消息,并将此网络消息发送到远程服务器,交由远程服务执行对应方法,在发送完调用请求后,客户端存根随即阻塞,直到收到服务器发回响应消息为止...下图展示了远程方法调用过程中客户端和服务端各个阶段操作。总结下RPC执行步骤:调用客户端句柄,执行传递参数。调用本地系统内核发送网络消息消息传递到远程主机,就是被调用服务端。...服务端句柄得到消息并解析消息。服务端执行被调用方法,并将执行完毕结果返回给服务器句柄。服务器句柄返回结果,并调用远程系统内核。消息经过网络传递给客户端。客户端接受数据。...安装gRPC和ProtobufgRPC由google开发,是一款语言中立、平台中立、开源远程过程调用系统gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用在

20121

你不知道gRPC反向代理

特殊编解码-codec 我们知道,gRPC收到消息后,会根据protobufcodec来对消息进行编解码。...然而,在proxy内部,其既需要作为server端接收数据,又需要作为client端发送数据。...因此,在gRPC中,对于收到protobuf消息,我们需要采用默认protobuf codec,而对于proxy内部数据转发我们需要一个对协议无感知仅作转发codec。 2....为了去获取到请求流meta信息,我们有两种方式: 第一,我们可以结合gRPC协议特性,根据grpc.MethodFromServerStream()函数,grpc client请求中剥离出调用接口名...= nil { ret <- err break } if i == 0 { // grpc客户端到服务器header只能在第一个客户消息后才可以读取到,

8.3K143

谷歌开源、高性能RPC框架:gRPC 使用体验

gRPC 目前提供 C、Go 和 JAVA 等语言版本,对应 gRPCgRPC-Go 和 gRPC-JAVA 等开发框架。...gRPC 客户端和服务端都可以用任何支持 gRPC 语言来实现,例如一个 gRPC 服务端可以是 C++语言编写,以供 Ruby 语言 gRPC 客户端和 JAVA 语言 gRPC 客户端调用...Stream 流有几个重要特性: 单个 HTTP/2 连接可以承载多个并发 stream 流,通信双方都可能交叉地收到多个 stream 流数据帧; stream 流可以单方面建立与使用,也可以由客户端和服务器双方共享消息通道...Wireshark 过滤框输入 HTTP2 就可得到一次完整 gRPC 调用细节: 4.gRPC 调用分析 以上抓包得到 gRPC 调用图可知,gRPC客户端(port:62880)一次调用服务端...HEADERS 帧+DATA 帧(gRPC)+HEADERS 帧(终止流) 服务端收到客户 PING 帧确认客户端存活状态后, a.

1.2K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券