【问题标题】:How to create a custom binary protocol server? [closed]如何创建自定义二进制协议服务器? [关闭]
【发布时间】:2013-07-31 20:58:00
【问题描述】:

请告知创建自定义二进制协议服务器的最佳解决方案。服务器应通过 TCP/IP 上的二进制协议接受来自多个设备的通信。

是否有任何现有的服务器/框架解决方案可用? IE。 node.js 适合解决这个问题吗?首选的解决方案是面向 Java 的。

提前致谢!

更新:需要二进制协议来减少通信数据量。协议的任何文本格式都可能过于冗长。此外,设备的协议已经指定。

【问题讨论】:

  • 要说的太多了。有什么理由必须是二进制的吗?文本会更容易使用吗?您可以只使用 Java 中内置的库。
  • 您可以只使用ServerSocket - 但这显然需要您从头开始实施。你不能只通过 HTTP 发送二进制数据吗? Base64?
  • 您说文本格式“可能过于冗长”,但大多数情况下最好还是采用一种格式。文本格式比二进制格式更容易测试和调试,并且使用 gzip 压缩文本流将消除大部分开销。选择没有表现出性能问题的二进制格式通常是过早的优化。

标签: java tcp binary protocols


【解决方案1】:

我前段时间实现了这样的事情。为此,我使用了两个标准的 Java API:

  1. java.net 包:java.net.ServerSocket 和 java.net.Socket 应该能够满足您的大部分需求。
  2. java.concurrency 包:对于从 ServerSocket 实例接受的每个新连接 Socket,您可能希望将此连接 Socket 的处理移动到另一个线程并开始使用阻塞 ServerSocket.accept() 方法侦听下一个连接再次 - 一种生产者 - 消费者模式实现。可以通过将新连接的 Socket 发布到队列中来完成,然后将其用于提供线程池,并且该线程池中的每个线程负责实际的连接处理。

注意:有时当您不确定客户端和服务器之间会发生什么样的会话模式(例如,如果他们希望首先通过 TCP/IP 发送数据),从一个 Socket 并在不同的线程中将数据写入同一个 Socket。

【讨论】:

    【解决方案2】:

    基本思想是java.netSocketsServerSockets,线程的组合,以及基于DataOutputDataInput设施的协议实现。

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2011-02-01
      • 2011-04-20
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2010-09-12
      • 2010-11-01
      相关资源
      最近更新 更多