我已经实现了一个 C 服务器和一个 Java 客户端,它们通过 TCP 相互通信。问题是当客户端发送一个字符串时,C 服务器中的 recv() 调用只是读取一个字符并立即返回。如果我在 recv() 处放置一个断点,然后执行单步执行,服务器会收到发送的整个字符串。 这是我在 C 中使用的 recv 调用
char tempBuffer[256] = {'\0'};
int retVal = recv(hClientSocket, tempBuffer, sizeof(tempBuffer), 0);
这是 Java 客户端。
clientSocket = new Socket("127.0.0.1", 24886);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes("alert(\"hi\")");
我的问题是,有没有一种方法可以使我无需在我的 C 服务器代码中放置一个 while 循环来分别接收每个字符?最好的方法是什么? 我实现了给定的 C++ 客户端 here它工作正常。所以我猜这是 Java+C++ 互操作性方面的一些问题。谢谢!
最佳答案
尽管 Scott M 所说的在 Java 方面是正确的(关于使用 flush
),但您将不得不重新设计整个通信协议(protocol)。
您必须告诉 C 代码,预计要发送多少字节(这将是最容易跟踪的),或者使用某种终止符,以识别字符串输入结束(例如空终止符字节)。
绝对不能保证网络层不会任意切断转换,因此要进行防御性编码并期望 recv
总是收到部分数据,您必须将这些数据组装起来供内部使用。
关于java - C 服务器和 Java 客户端。如何阅读完整的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10140934/