Java 无法使用C在客户端读取消息

Java 无法使用C在客户端读取消息,java,c,sockets,protocol-buffers,Java,C,Sockets,Protocol Buffers,我使用协议缓冲区来构建数据结构,在服务器端,我编写以下代码来使用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,

我使用协议缓冲区来构建数据结构,在服务器端,我编写以下代码来使用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的原因…

recv()
如果连接已关闭,则返回
0


要从客户端关闭连接,请通过调用
socket.close()

关闭套接字,尝试
writeDelimitedTo(os)
以及为什么不在客户端使用protobuf API?您确定
os.close()
确实会关闭套接字吗?recv函数只有在连接断开时才会返回0,否则它将挂起等待数据。我不负责客户端接收…他们希望使用原始C代码处理套接字…实际上,客户端套接字在从服务器接收数据后关闭。。。我还在服务器端写socket.close()。。。另外,还有一个问题是在服务器端从客户端接收数据。这是你的电话号码。如果你能帮助我,我将不胜感激@RyanZhu:我刚刚意识到我在回答中混淆了服务器和客户端。Sry!一点也不……事实上,我真的发现,一旦我关闭客户端的套接字,我就可以正确地获取数据……但是客户端不允许关闭,因为它仍然有责任从服务器接收数据。。。所以我必须寻找另一种方法来解决这个问题。。。