【问题标题】:Java Server Socket with Client in CC语言中带有客户端的Java服务器套接字
【发布时间】:2026-02-16 01:05:01
【问题描述】:

我已经用java编写了服务器套接字代码。相关行是:

byte[] bRecieved = new byte[440] ;
1int i =in.read(bRecieved);
Arrays.toString(bRecieved);

如果客户端是用java编写的,这很好用

 byte[] bSend = {1,2,3,4};
 DataOutputStream out =
                       new DataOutputStream(outToServer);
 out.write(bSend);

但是客户端是用 C++ 编写的。发送代码为:

if (client.connect(serverIP, serverPort)) {
   String msg="Hello Server";//Message to be sent
    client.println(msg);//send the message
}

我的问题是,我如何与需要字节的 java 服务器通信?连接成功并在服务器控制台上打印字节。但它们不是“Hello Server”。我是否必须遍历字节并将它们解释为字符? Chars 和 int 在 C++ 中是 1 个字节。

如果可能,请澄清这种情况。 提前致谢!

【问题讨论】:

  • C++ 程序需要刷新它的缓冲区。阅读有关行缓冲和刷新的信息。
  • 另外,int 在 C++ 中不是一个字节。它实际上是特定于平台的,尽管您可能要接触的几乎所有东西都有一个 int 作为 4 个字节。

标签: java c++ sockets


【解决方案1】:

您的 C++ 套接字使用什么库?

您可以尝试刷新流吗?

【讨论】:

    【解决方案2】:

    默认情况下,C++ 客户端是行缓冲的。这意味着它实际上不会发送数据,直到将换行符推送到出站数据上或保存要发送的数据的缓冲区填充超过某个点(取决于系统)。如果您想看到这一点,请将您的msg 字符串设置为"Hello Server\n"。您的数据应立即发送。

    flush() 命令说,“现在发送所有数据,不管缓冲区中有多少。”所以你可以选择一个另一个,要么调用flush(),要么添加一个换行符。当然,如果您使用换行符,Java 进程将收到除字符串之外的换行符,这可能是您想要的,也可能不是您想要的。通常,在执行网络操作时,您希望在向出站缓冲区添加内容后调用flush()

    【讨论】:

    • C++ 中的字符串 "Hello Server\n" 将显示为 byte [] {'H','e'.....} 还是字符的 ascii 表示?
    • C++ 代码应该只发送该字符串的 ASCII 字符,包括 \n 字节。