草庐IT

java - Java Socket 客户端和 C++(基于 Boost)服务器之间的联网

coder 2023-09-18 原文

在工作中,我正在设计一个用于控制机器人组的用户界面。机器人使用 UDP 广播来管理彼此之间的 Action 。

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 以查看是否有帮助。

我们遇到了问题。 Boost 甚至没有注册我发送了消息,即使 Java 成功注册了。此外,当从服务器发送字符串时,它们的格式无法识别。

对该问题的一些调查表明,Boost 会自动将“标题”文本附加到它发送的所有消息中,帮助它归档收到的消息。由于 Java 不这样做,因此看起来这可能是原因。这个对吗?如果是这样,我们该如何解决?


一些注意事项:

  • 由于时间限制,大规模切换到不同的库/语言并不是真正的选择。但是,如果有一个 C++ TCP 库可以让服务器接收我发送的消息,并且我们可以轻松地集成它,那就完美了。
  • Java 网络代码在连接到 Java 服务器时运行良好。困难似乎发生在 Boost-Java 接口(interface)中。
  • 不幸的是,无论是我自己还是从事该项目这方面工作的其他人都没有网络方面的经验。 :( 我的经验是 Java 和 GUI 开发,另一个人是 AI 程序员/硬件专家。非常欢迎任何和所有帮助解决这个问题。

最佳答案

从发送和接收第一个字节开始,然后是整数。注意大小(例如 C++ 中的 64 位整数)和字节顺序(最低位优先与最高位优先)。正如 Sam Miller 提到的,您将需要创建自己的协议(protocol),该协议(protocol)将定义您可以发送的消息类型及其元素的排序方式。

可能发生的情况是 Boost 首先发送字符串的长度。请仔细阅读使用 Boost 库发送的消息的有线格式,以及 DataOutputStream 使用的有线格式。

关于java - Java Socket 客户端和 C++(基于 Boost)服务器之间的联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029848/

有关java - Java Socket 客户端和 C++(基于 Boost)服务器之间的联网的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  6. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  7. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  8. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  9. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐