2012-02-20 25 views
1

クライアントがC++で記述され、サーバーがJavaであるクライアント/サーバーアプリケーションを作成しています。それらの間の通信はUDPプロトコルによって行われます。 ネットで文字列メッセージを交換する必要があります。 ここでは、通信が大量に行われ、クライアントがメッセージを送信してサーバーが受信しますが、Java側で受信した文字列がトランケートに似ていることに気付きました。私は機能と、コンソールにそれを表示しようとする場合、私は、意味:C++クライアントからJavaサーバーへのネット上の文字列の送信

System.out.println("This is the message received " 
          + message + " by the client just now"); 

私は得る結果は次のとおりです。

This is the message received *message* 

文字列と「クライアントによるちょうど今」アウトトランキング。

私はそれがJavaとC++の間にいくつかの非互換性があると思いますが、私は解決策を見つけることができません。

編集:

byte[] bytes = _packet.getData(); // Datagram Packet 
hostName = getStringFromBytes(bytes, 0, 15); 

(...) 

private String getStringFromBytes (byte[] bytes, int lowerBound, int length) 
{ 
    byte[] bufferBytes = new byte[length]; 
    System.arraycopy(bytes, lowerBound, bufferBytes, 0, length); 

    return new String(bufferBytes).trim(); 
} 

送信者: ここで、受信機のコードだバッファがcharの配列である

if(sendto(_socket, buffer, BUFFER_LEN, 0, (struct sockaddr*) &_serverAddress, addressLenght) == -1) 
    cout << "Trasmission failed!\n" << endl; 

+0

コードを入力してください。 –

+5

メッセージはおそらく0で終了していますか? – BoBTFish

+0

ワイヤーに当たったら、それはJavaとC++の関係ではありません。 @BoBTFishに基づいて、空白とASCIIの制御文字を削除するにはmessage.trim()を試してください。 – Thomas

答えて

3
if(sendto(_socket, buffer, BUFFER_LEN, 0, (struct sockaddr*) &_serverAddress, addressLenght) == -1) 

この行は、バッファがc-stringであると思われます。この場合、サーバー側で余分なNULL文字を解析する必要があります。 C文字列のNULL文字は、NULL文字が表示されるとすぐにJAVAコードが文字列の処理を停止する原因になります。

あなたのJavaコードの文字列の最後の文字を削除するだけで済みます。 C-ストリングは常に最後に余分な文字、つまりNULL文字を持っていることに注意してください。

また、BUFFER_LENはマクロですか?それは何と定義されていますか?あらかじめ定義された長さではなく、実際のバッファ長を送信してみてください。 C++、すべての可能な使用のstd ::文字列では、ないのchar *で

すなわち

std::string buffer = "Your Message"; 

if(sendto(_socket, buffer.c_str(), buffer.length(), ...) 

そして一般的には、。

+2

これを見て、BUFFER_LENは配列のサイズを定義するために使用される定数またはマクロですか?次に、 "Actual message \ 0somegarbage"が表示されます。この場合、\ 0は切り取られずに出力が終了します。 – BoBTFish

+1

@BoBTFish絶対に!それはおそらく問題のすべてです。 –

2

バッファで期待される[長さ]を必ずしも受け取っていない可能性があります。その結果、文字列に変換するときに、バッファの最後にランダムなバイトがあります。これらのバイトのいくつかは、コンソール出力を混乱させる制御コードを表す可能性があります。

I String.trimは文字列からNULL(\ 0)文字を削除しますが、 '\ u0020'を超える文字は削除しません。 (Javadocを参照してください:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim())

を正しいならば、あなたは文字列変換のいずれかを確認する必要があります。

  • があなたの期待されるバイトのバッファ長の何らかの形で独立した文字列の終わりを検出します。おそらく、1番目のNULLターミネーター文字を検索します。または、
  • 上記の文字列内の空白文字をすべて置換して、期待どおりの文字列エンコーディングに従ってString.trimが行う処理を超えます。
1

あなたはJava側に続いて、あなたのメッセージの先頭にあなたの「メッセージ」

std::string strMessage = "My Message"; 

    char* pBuffer = new char[sizeof(int) + strMessage.size()]; 

    int iSize = strMessage.size(); 
    memcpy(pBuffer, &iSize, sizeof(int)); 
    memcpy(pBuffer + sizeof(int), strMessage.c_str(), strMessage.size()); 


    if(sendto(_socket, pBuffer, sizeof(int) + iSize, 0, (struct sockaddr*) &_serverAddress, addressLenght) == -1) 

... 

delete pBuffer; 

の実際のサイズを追加してみてください、あなたは両方のシステムではsizeofを想定した(最初の4つのバイトを読みますintは4です)、次に読み込んだ番号の文字列を作成します。

関連する問題