java - 客户端/服务器 - 如何将协议(protocol)与网络逻辑分开?

标签 java unit-testing network-programming protocols network-protocols

我想实现和单元测试(不一定是 TDD)一个客户端应用程序,该应用程序使用某种应用程序协议(protocol)与 TCP 服务器进行通信。

我在here (1)等地方见过和 here (2)该协议(protocol)代码最好应该与网络代码解耦,这样每个协议(protocol)代码都可以单独进行单元测试。

但是我无法理解应该如何设计和实现这些部分。

第一个链接讨论了 MyProtocolHandler 类,其方法为 HelloMessage()HowdyMessage()。这是否意味着协议(protocol)处理程序应该有两种方法来生成消息和处理响应?我将如何使用它们?还有一件事,每个消息/响应对应该有不同的 ProtocolHandler 类,还是所有消息/响应都只有一个类?

第二个链接讨论了ReaderWriter。同样,我无法理解应该如何使用它们。

这两个只是例子。主要问题是,如何将逻辑与网络解耦并对它们进行单元测试?我不得不说我还没有尝试过任何事情;我习惯于只编写耦合代码,不知道从哪里开始。

最佳答案

这些是完成任务的不同方法。网络堆栈被设计为不同的层,其中每一层都向上层提供“明确定义”的功能,并通过 API 提供这些功能。

因此,如果您想实现在 TCP 或 SSL 上运行的自己的应用程序层协议(protocol)(反过来可能会在 TCP 上运行),您将使用套接字接口(interface)。设计该部分的方式与设计任何应用程序的方式相同。一般来说,您希望将应用程序逻辑与协议(protocol)分开,称之为 A 逻辑。您的协议(protocol) A 将负责使用套接字(写入和读取)向服务器发送消息,从服务器读取消息,处理超时(例如,当期望服务器永远不会到达响应时),处理套接字错误、消息格式、消息解析等。协议(protocol) A 将从您的应用程序中隐藏所有这些问题。

你的应用程序只会处理你的协议(protocol)提供的API函数:像HelloMessage一样,它会调用该方法,并且在内部,HelloMessage将处理套接字、消息格式等。

现在你的协议(protocol) A 只能由一个类或一组类来实现。如果它是一组类,我建议您将它们作为同一包的一部分。

详细说明如何实现它,我建议两个选项: 1)您有一个 Reader 和 Writer 类,它们是套接字的包装器。然后,您的协议(protocol)类使用这些读取器和写入器,并且您可以在不使用具有不使用套接字的子读取器和写入器的网络的情况下对其进行测试。 2)这更复杂,您可以有一个通信类,它可以接收要通过消息队列发送的消息,也可以使用另一个消息队列发送收到的消息。通信类知道如何处理连接或套接字(取决于抽象级别)。它知道如何打开连接、处理超时等。这是一个更好的设计,但太复杂了。

我希望这会有所帮助。

关于java - 客户端/服务器 - 如何将协议(protocol)与网络逻辑分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43309227/

相关文章:

java - JasperReports 字体扩展 +~JF*****.tmp 文件

java - 面板不会显示在窗口中

javascript - 如何使用 Sinon/Qunit 模拟 'timeout' 或 'failure' 响应?

c - sendto 在 Mac OS X 10.8 上返回 EINVAL

java - 杰老板。 .ear 部署期间出现 NullPointerException 之一

java - 使用带有 hibernate 的 AbstractTableModel 将 Row 插入 jtable

java - 如何测试使用数据库登录的Servlet?

javascript - Angular 单元测试授权 header 拦截器不起作用

network-programming - DHCP 选项查询

python - 如何向 IGMP 设备发送 UDP 数据报?