私は、ロボットのグループを制御するためのユーザインタフェースを設計しています。ロボットは、互いの動きを管理するために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プログラマ/ハードウェアの専門家である。この問題を持つ任意およびすべてのヘルプは非常に歓迎されるであろう。
これらのメッセージをフレーム化するために使用しているプロトコルは何ですか? –
どういう意味ですか?今すぐストレートStringデータを送信することをテストしています。 Javaコードのコアは上記のとおりです。 Boostコードは、Boost Asio TCP Synchronousの例に基づいています。 – Kronos
TCPはバイトのストリームです。私はどのくらいのバイト受信機が期待している必要がありますか?ヘッダーはありますか?センチネル値はありますか? –