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());そうしないと、4文字がC++サーバーに出力されます。

4

4 に答える 4

2

Javaオブジェクトのシリアル化を行うを使用しObjectOutputStreamています。これは、言語間で(簡単に)移植できません。文字列を送信するだけなので、 -を使用する必要はありません。ソケットから返されたものを使用するだけです。ObjectOutputStreamOutputStream

于 2012-05-16T02:26:12.007 に答える
0

オブジェクトのシリアル化には、サードパーティのライブラリを使用することを強くお勧めします。手動で行うと、(あなたにとって)非常に時間がかかり、エラーが発生しやすくなります。

私は個人的にGoogleProtocolBuffersの大ファンです。ほとんどすべてのプロジェクト(Javaサーバー、.Netクライアント、C ++クライアント)で積極的に使用しています。

それは何ですか? プロトコルバッファは、構造化データを効率的でありながら拡張可能な形式でエンコードする方法です。Googleは、ほとんどすべての内部RPCプロトコルとファイル形式にプロトコルバッファを使用しています。

さまざまな言語の実装のリストはこちらです。

于 2012-05-16T02:39:41.523 に答える
0

また、C ++側でJNIを使​​用して、逆シリアル化を処理することもできます。

C++を使用してJavaオブジェクトを直接逆シリアル化することはできません。

于 2012-05-16T03:01:21.747 に答える
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 に答える