当前位置: 首页 > 知识库问答 >
问题:

gRPC—发送。Protobuf中从Java客户端到Python服务器的png图像

喻子航
2023-03-14

我正在尝试使用gRPC和ProtoBuf将图像从Java客户端发送到Python服务器。我将图像编码为ByteString,并使用blockingStub发送它。Python服务器接收ProtoBuf,但Java ByteString现在是Python str。我不知道如何从str恢复图像。

当我调用服务器时:

request.ParseFromString(request.png_encoded)  # Throws error

它提出:

回溯(最近一次调用):

文件“/usr/local/lib/python2.7/dist-packages/grpc/server.py”,第364行,在调用行为中

返回行为(参数、上下文),True

进程请求中的文件“process_server.py”,第57行。ParseFromString(request.png_encoded)

ParseFromString self中的文件“/usr/local/lib/python2.7/dist-packages/google/protobuf/message.py”,第185行。MergeFromString(序列化)

文件“/usr/local/lib/python2.7/dist-packages/google/protobuf/internal/python\u message.py”,第1082行,在MergeFromString中,如果self_InternalParse(序列化,0,长度)!=长度:

文件“/usr/local/lib/python2.7/dist packages/google/protobuf/internal/python\u message.py”,第1108行,位于InternalParse new\u pos=local\u SkipField(缓冲区、new\u pos、end、tag\u字节)

文件“/usr/local/lib/html" target="_blank">python2.7/dist-packages/google/protobuf/internal/decoder.py”,第850行,在SkipField中返回WIRETYPE\u TO\u SKIPPER[wire\u-type](缓冲区,位置,结束)

文件“/usr/local/lib/python2.7/dist-packages/google/protobuf/internal/decoder.py”,第820行,位于RaiseInvalidWireType中

raise \u DecodeError('标记的导线类型无效')

DecodeError:标签有无效的线类型。

Java客户端:

public void run_process(String imPath) {
    logger.info("Will try to retrieve boxes with image " + imPath + " ...");
    File path = new File(imPath);
    byte[] imageInByte = null;
    ByteString byteIm = null;
    try {
        BufferedImage bufferedIm = null;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        bufferedIm = ImageIO.read(path);
        ImageIO.write(bufferedIm, "png", out);
        out.flush();
        imageInByte = out.toByteArray();
        out.close();
        ByteBuffer buf = ByteBuffer.wrap(imageInByte);
        byteIm = ByteString.copyFrom(buf);
    } catch (IOException e) {
        e.printStackTrace();
    }

    private final ManagedChannel channel;
    channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext(true).build();
    private final ProcessServiceGrpc.ProcessServiceBlockingStub blockingStub;
    blockingStub = ProcessServiceGrpc.newBlockingStub(channel);

    ProcessRequest request = ProcessRequest.newBuilder().setPngEncoded(byteIm).build();
    ProcessResponse response;
    try {
        response = blockingStub.process(request);
    } catch (StatusRuntimeException e) {
        logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
        return;
    }
    logger.info("Boxes retrieved: " + response.toString());
}

Python服务器:

def Process(self, request, context):
    print(type(request.png_encoded))  # prints <type 'str'>
    request.ParseFromString(request.png_encoded)  # Throws error

    # Return empty response for now
    process_response = inference_pb2.ProcessResponse()
    return process_response

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    inference_pb2.add_ProcessServiceServicer_to_server(
        ProcessServiceServicer(), server)
    print "Starting Process Server"
    server.add_insecure_port('localhost:50051')
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()

我曾尝试在谷歌上搜索“用Python解码Java Protobuf”和“用Python测试环解码Java Protobuf”,但没有成功。提前感谢!

共有1个答案

松英叡
2023-03-14

Java中的ByteString就是一个不可变的字节[]。Python 2的等价物是str。它是二进制表示。如果要将映像保存到磁盘,请执行以下操作:

with open('out.png', 'wb') as file:
    file.write(request.png_encoded)
 类似资料:
  • 我对gRpc很陌生,已经开始探索它们的基础知识(在C语言中)。我想获得有关如何发送心跳以检查客户端/服务器是否仍处于连接状态以及在断开连接时采取恢复措施的指导。任何示例或参考任何文档/文章都将有助于我开始学习。谢谢

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 有可能从客户端向服务器抛出异常吗?我们有一个从服务器到客户端的开放流: 当我尝试这样的事情时: 我在客户端的StreamObserver.on错误中获得了异常,但在服务器端没有异常。

  • 问题内容: 首先,我将请求的文件从服务器发送到客户端,然后再将文件的计算出的sha从服务器发送到客户端,以便客户端可以检查发送文件和接收文件中的sha是相同的。 我设法发送了文件,但是当我尝试也发送sha(这是一个变量)时,我收到一个错误消息(我相信sha也已添加到文件内容中) 如何分别发送? 和客户: 问题答案: 您应该重新设计应用程序的工作方式: 首先,服务器将文件大小发送给客户端 客户端读取

  • 我正试图从套接字服务器(Java)向套接字客户端(Python)发送一个映像,但客户端中接收到的映像大小不正确,无法打开。我不知道我做错了什么。有什么建议吗?

  • 我想通过套接字从我的客户端(这是一个Java应用程序)发送一个图像到我的服务器,服务器应该用Python编程。不幸的是,我是Python/Java编程的新手,不理解我在网上找到的大多数方法,但到目前为止似乎效果最好的是: 在客户端,我这样做了 如果我理解正确,只需将图像数据以bytearray的形式发送到接收端口。 现在,在服务器(Python)上,我有以下内容: 它似乎可以传输数据,因为在启动我