【发布时间】:2013-01-16 05:39:48
【问题描述】:
我使用协议缓冲区来构建数据结构,并在服务器端编写以下代码以使用 Java 发送消息,而在客户端使用 C 接收消息。
Java 服务器:
OutputStream os = socket.getOutputStream();
GameResponse.Builder builder=GameResponse.newBuilder();
builder.build().writeTo(os);
os.flush();
os.close();
C 客户端:
while ((n = ::recv(sockfd, buf, BUFFLEN, 0)) > 0) {
write(STDOUT_FILENO, buf, n);
len += n;
}
原来服务器发送的消息是正确的,但客户端无法接收。看起来while循环永远不会中断它进入死循环。我们认为这可能是 C recv 函数从未获得 EOF 来结束数据传输的原因......
【问题讨论】:
-
试试
writeDelimitedTo(os),为什么你不在客户端使用protobuf API? -
你确定
os.close()真的关闭了套接字吗? recv 函数只有在连接断开时才会返回 0,否则会挂起等待数据。 -
我不负责客户端接收......他们想使用原始C代码来处理socket......
标签: java c sockets protocol-buffers