java - C 服务器和 Java 客户端。如何阅读完整的字符串?

标签 java c++ c sockets winsock

我已经实现了一个 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/

相关文章:

Java - 将 int 更改为 ascii

c++ - 处理多个子目录中的 Makefile 依赖关系并输出到单独的子目录

C++:使用 PostMessage/SendMessage 发送鼠标点击

c - 如何在 C 语言中获取 alt 和 control 键的扫描码?

c - R_alloc 和对齐注意事项

java - 从 ArrayList<ArrayList<Object>> 到固定大小的数组/列表

java - 在java编译器中标记行的问题

java - 最小化键盘而不是在按回键时返回到之前的 Activity

python - macOS - 安装 dlib 时遇到问题

c - libunistring u8_strlen() 等于 strlen()?