2011-08-11 9 views
1

私は、ロボットのグループを制御するためのユーザインタフェースを設計しています。ロボットは、互いの動きを管理するためにUDPブロードキャストを使用します。JavaソケットクライアントとC++(Boostベース)サーバとの間のネットワーク

GUIは、ロボットと通信できる必要があります。このために、仲介サーバーが実行されます。すべてのロボットはそれに耳を傾け(UDPセンサーで)、実行中のすべてのGUIが(TCP経由で)接続します。 GUI < - >ロボット通信を管理します。

しかし、サーバーはC++ Boostライブラリで書かれており、GUIはJavaで書かれており、ネットワーキングに関するいくつかの問題が発生しています。私はかなり簡単にソケットでサーバに接続します:

try { 
    socket = new Socket(targetAddress, targetPort); 
} catch (IOException e) { e.printStackTrace(); } 

サーバが接続を登録し、すべてがうまく見えます。しかし

、私は文字列送信しよう:

try { 
    stream.writeUTF(message); 
    stream.flush(); 
} catch (IOException e) { e.printStackTrace(); } 

注:私は最初に一度に文字列1を送信するためにPrintWriterを使用していた(のprintln())をそれは希望かどうかを確認するためにDataOutputStreamのに切り替え助けて。

問題が発生しました。 Boostは、たとえJavaが成功したとしても、私がメッセージを送ったことを登録していません。さらに、文字列がサーバーから送信された場合、文字列は認識できない形式になります。

問題を調べると、Boostが送信するすべてのメッセージに自動的に「ヘッダー」テキストが追加され、受信したメッセージをアーカイブするのに役立ちます。 Javaはこれをしないので、これが原因かもしれないようです。これは正しいです?もしそうなら、どうすればそれを回避することができますか?


いくつかの注意事項:

  • 時間の制約のために、大規模に異なるライブラリ/言語に切り替えるには本当にオプションではありません。しかし、私が送信したメッセージをサーバが受信できるようにするC++ TCPライブラリがあり、それを簡単に統合できるのであれば、となります。
  • Javaネットワークコードは、Javaサーバーに接続するときに完全に機能します。 Boost-Javaインターフェースで問題が起きているようです。
  • 残念なことに、自分自身や他の人がこのプロジェクトのこの側面に取り組んでいる人は、ネットワークに慣れていない人です。 :(私の経験では、JavaとGUI開発であり、そして他の人はAIプログラマ/ハードウェアの専門家である。この問題を持つ任意およびすべてのヘルプは非常に歓迎されるであろう。
+0

これらのメッセージをフレーム化するために使用しているプロトコルは何ですか? –

+0

どういう意味ですか?今すぐストレートStringデータを送信することをテストしています。 Javaコードのコアは上記のとおりです。 Boostコードは、Boost Asio TCP Synchronousの例に基づいています。 – Kronos

+0

TCPはバイトのストリームです。私はどのくらいのバイト受信機が期待している必要がありますか?ヘッダーはありますか?センチネル値はありますか? –

答えて

0

スタート&受ける最初のバイトを送信し、その後、 int C++で64ビットのint値とバイトオーダーを認識しています(最小のものと最も重要なものがあります)Sam Millerが述べたように、独自のプロトコルを作成して、どのような種類のメッセージを送信するのかを定義する必要があります。&それらの要素がどのように順序付けられているかを示します。

おそらく、Boostが文字列の長さを最初に送信することがあります。ブーストライブラリを使用して送信されたメッセージのワイヤ形式とワイヤf DataOutputStreamで使用されるormat。

0

最初に、エンコード、バイトオーダー、およびパッケージ形式Boostがコマンドの開始と終了を決定するために使用していることを知る必要があります。 たとえば、comandはWALKのようになりますが、接続上にWALK文字列を送信しないだけです。 \ nのような区切り文字を使用することができます:WALK \ n 別のことは、エンコーディングが何を使用しているかを知ることです。文字列メソッドmyString.getBytes( "UTF-8")を使用できます。ソケットの出力ストリームを使用してネットワーク上でUTF-8でbyte []を送信します。

関連する問題