【问题标题】:How can I send data from a Java client to a C++ server?如何将数据从 Java 客户端发送到 C++ 服务器?
【发布时间】:2012-05-17 17:17:06
【问题描述】:

Java 客户端可以使用 TCP 连接到 C++ 服务器。 Java 客户端在 Win7 上。 C++ 服务器在 Linux 上。

问题是我无法成功地将数据发送到 C++ 服务器。 Java代码是:

public static void main (String [] args ) throws IOException {
    Socket sock = new Socket("10.217.140.200",7000); 

    String id = "TEST";
    char encoding = 'a';

    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
    oos.flush();

    oos.writeObject(encoding);

在您的帮助之后,我现在使用 outputstream 并且它可以工作。记得删除ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());,否则会输出4个字符到c++服务器。

【问题讨论】:

  • 您并没有真正提供足够的信息来确定问题出在哪里,但首先oos.flush() 应该在oos.writeObject() 之后,而不是之前。
  • 谢谢,我把 .flush() 移到最后
  • 现在,我可以从java客户端向c++服务器发送数据了,奇怪的是存储的数据从第四个位置开始(不知道为什么不使用0到3个位置)。当我在 c++ 端打印接收到的数据时,打印 0 到 3 的结果是 2 ?有谁知道前四个位置是干什么用的?
  • @GregKopff 感谢您的善意通知

标签: java c++ sockets client


【解决方案1】:

您使用的是ObjectOutputStream,它是Java object serialisation。这不是(很容易)跨语言移植的。由于您只发送一个字符串,因此您不需要使用ObjectOutputStream - 只需使用从套接字返回的OutputStream。

【讨论】:

  • 谢谢,我改成outputstream了,现在可以从java客户端向c++服务器发送数据了,奇怪的是存储的数据是从第四个位置开始的(不知道为什么从0到3个位置未使用)。当我在 c++ 端打印接收到的数据时,打印 0 到 3 的结果是 2?有谁知道前四个位置是干什么用的?
【解决方案2】:

我强烈建议使用一些 3rd-party 库来序列化您的对象。手动操作非常耗时(对您而言)并且容易出错。

我个人是Google Protocol Buffers 的忠实粉丝。我在几乎所有项目(Java 服务器、.Net 客户端、C++ 客户端)中都积极使用它。

这是什么? 协议缓冲区是一种以高效但可扩展的格式对结构化数据进行编码的方式。 Google 几乎所有内部​​ RPC 协议和文件格式都使用协议缓冲区。

不同语言的实现列表是here。

【讨论】:

    【解决方案3】:

    你也可以在你的 C++ 端使用 JNI 来处理反序列化的东西。

    您不能直接使用 C++ 反序列化 Java 对象。

    【讨论】:

      【解决方案4】:

      在更新您的代码以不使用 ObjectOutputStream 之后,我猜测您的问题可能出在 C++ 服务器中,或者是因为在通过套接字传输之前未将字符串转换为 ASCII。 Java 字符串可以用各种编码表示,包括 Unicode。

      这对你有更好的效果吗?

      public static void main (String [] args ) throws IOException
      {
          Socket sock = new Socket("10.217.140.200",7000);
          String id = "TEST";
      
          OutputStream oos = sock.getOutputStream();
      
          oos.write( id.getBytes("US-ASCII") );
          oos.flush();
      }
      

      如果没有,请通过编辑您的问题发布您更新的客户端和服务器端代码。

      【讨论】:

      • 虽然我同意您应该明确设置要使用的编码,但鉴于测试字符串只是“TEST”并且这将映射到几乎任何编码方案中的正确位置,我不认为这最终会成为问题。 (我的意思是,平台的默认编码方案很可能在“底部”有 ASCII 字符集,所以“TEST”应该可以工作)。
      • 是的,其实不用在里面加“US-ASCII”还是可以的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多