1

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());否则它将向 C++ 服务器输出 4 个字符。

4

4 回答 4

2

您正在使用ObjectOutputStream,它执行Java 对象序列化。这不是(很容易)跨语言移植的。由于您只发送一个字符串,因此您不需要使用ObjectOutputStream- 只需使用OutputStream从套接字返回的值。

于 2012-05-16T02:26:12.007 回答
0

在更新您的代码以不使用 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();
}

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

于 2012-05-16T03:49:44.910 回答
0

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

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

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

不同语言的实现列表在这里

于 2012-05-16T02:39:41.523 回答
0

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

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

于 2012-05-16T03:01:21.747 回答