2011-08-11 97 views
1

在工作中我設計用於控制機器人組的用戶界面之間的聯網。機器人使用UDP廣播來管理彼此的移動。Java的客戶端的Socket和C++(升壓型)服務器

的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(); } 

注:我最初是用一個PrintWriter來一次發送串一個(的println()),但切換到DataOutputStream類,看看它是否會幫幫我。

我們遇到的問題。即使Java成功,Boost甚至不會註冊我發送的消息。此外,當從服務器發送字符串時,它們的格式不可識別。

尋找到問題的一點建議,加速自動添加「標題」文本到它發送的所有郵件,幫助其存檔接收消息。由於Java沒有這樣做,所以這可能是原因。它是否正確?如果是這樣,我們如何解決它?


的幾個注意事項:

  • 由於時間所限,切換到不同的庫/語言大規模是不是一個真正的選擇。但是,如果存在允許服務器接收我發送的消息的C++ TCP庫,並且我們可以很容易地將其集成,那將是完美
  • 當連接到Java服務器時,Java網絡代碼完美工作。 Boost-Java界面似乎遇到了困難。
  • 不幸的是,我自己或其他人對這個項目的工作方面是有經驗的網絡。 :(我的經驗是用Java和GUI開發,和其他人是AI程序員/硬件專家。這個問題的任何及所有的幫助將是令人難以置信的歡迎。
+0

你用來構造這些消息的協議是什麼? –

+0

你是什麼意思?我們現在只是測試直接發送字符串數據。上面列出了Java代碼的核心。 Boost代碼基於Boost Asio TCP Synchronous示例。 – Kronos

+0

TCP是一個字節流。我在問接收機應該有多少字節?有頭文件嗎?有沒有定點值? –

回答

0

開始發送與接收&第一字節,則請注意尺寸(C++中的64位整數)和字節順序(最不重要,最重要的優先)。正如Sam Miller所提到的,您需要創建自己的協議,它將定義您可以發送哪種類型的消息&他們的元素是如何排序。

什麼可能發生的是,升壓首先發送字符串的長度,不要使用Boost庫發送的郵件的傳輸格式閱讀起來,和導線的F DataOutputStream使用的ormat。

0

首先,您需要知道Boost正在使用哪種編碼,字節順序和封裝格式來確定命令的開始和結束。 例如,一個命令可能像WALK,但你不會通過連接發送一個WALK字符串。 它可以使用像\ n這樣的分隔符,所以你會發送:WALK \ n 另一件事,就是要知道它使用的編碼是什麼,可以使用字符串方法myString.getBytes(「UTF-8」);通過使用套接字輸出流的網絡在UTF-8上發送byte []。