2011-08-11 56 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 []。