我正在尝试使用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”,但没有成功。提前感谢!
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)上,我有以下内容: 它似乎可以传输数据,因为在启动我