gpt4 book ai didi

java - 为什么 parseFrom() 函数在 java 套接字中使用 protobuf 挂起?

转载 作者:行者123 更新时间:2023-11-30 06:24:29 25 4
gpt4 key购买 nike

我只想使用 protobuf 和 java 创建 echo 服务器/客户端。

我用 protobuf-java-2.4.1 和 jdk1.7 测试过。

我写了如下回显服务器代码

// create server socket and accept for client connection.
// ...
link = servSock.accept();
Person person = Person.parseFrom(link.getInputStream()); // blocking position
person.writeTo(link.getOutputStream());

我觉得Person.proto没有必要注释。

客户端代码仅使用套接字输入流发送 Person 对象并接收回显 Person 对象。

// socket connect code was omitted.
Person person = Person.newBuilder().setId(1).setName("zotiger").build();
person.writeTo(echoSocket.getOutputStream());
person = Person.parseFrom(echoSocket.getInputStream());

但是当服务端和客户端同时运行时,服务端在parseFrom函数中被阻塞了。

我发现如果我使用 writeDelimitedTo() 和 parseDelimitedFrom(),就可以了。我不明白为什么 writeTo() 和 parseFrom() 函数不起作用。

为什么服务器阻塞在那里?

是否需要从客户端发送一些结束信号?

最佳答案

您必须使用 writeDelimitedTo()/parseDelimitedFrom() 的原因是,否则 Protocol Buffer 可能不知道需要从套接字读取多少数据。这就带来了一个问题(我说可能因为你当然可以创建一个只有固定长度字段的消息,不需要这个......但是 Protocol Buffer 必须处理这两种情况)

writeDelimitedTo() 方法将消息的长度写入 OutputStream,然后写入消息本身。它的对应部分 parseDelimitedFrom() 读取长度,然后读取消息。

您可以将 writeTo()pasrseFrom() 与流一起使用,但前提是您要写入/读取单个消息并在写入后关闭流。然后,读取器将获得一个 EOF 以指示消息结束(从仅包含一条消息的文件读取时也是如此)。

关于java - 为什么 parseFrom() 函数在 java 套接字中使用 protobuf 挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com