如何实现网络协议?

2022-09-01 07:49:00

这是一个通用问题。我不是在寻找最好的答案,我只是想让你表达你最喜欢的做法。

我想在Java中实现一个网络协议(但这是一个相当普遍的问题,我在C++中遇到了同样的问题),这不是第一次,因为我以前这样做过。但我认为我错过了实现它的好方法。实际上,通常这一切都是关于在主机之间交换文本消息和一些字节缓冲区,存储状态并等待下一条消息出现。问题是,我通常最终会得到一堆开关,并且或多或少复杂的如果语句对不同的状态/消息做出反应。整个事情通常会变得复杂且难以维护。更不用说有时出现的东西有一些“盲点”,我的意思是协议的状态尚未被覆盖并且以不可预测的方式运行。我试图写下一些状态机类,这些类负责以或多或少聪明的方式检查每个操作的开始和结束状态。这使得协议编程非常复杂,因为我必须编写一行又一行的代码来涵盖每种可能的情况。我想要的是一个好的模式,或者一个用于编写复杂协议的最佳实践,易于维护和扩展,并且非常可读。

你有什么建议?


答案 1

阅读状态设计模式,了解如何避免大量 switch 语句。


“有时出来的东西有一些'盲点',我的意思是协议的状态没有被覆盖......”

国家可以帮助避免差距。它不能保证一个好的设计,你仍然必须这样做。

"...因为我必须编写一行又一行的代码来涵盖每种可能的情况。

这不应被视为负担或问题:您必须编写代码行来涵盖每种可能的情况。

状态可以提供帮助,因为您可以利用继承权。它不能保证一个好的设计,你仍然必须这样做。


答案 2

设计协议通常与您正在处理的应用程序空间有关。例如,http是关于处理网页,图形和帖子的,而FTP是关于传输文件的。

简而言之,首先,您应该确定您所处的应用程序空间,然后定义需要执行的操作。最后,在你开始设计你的实际协议之前,你应该认真地,认真地寻找另一个协议栈,做你想做的事情,并避免实现协议栈altoether。只有在你确定其他预先构建的东西绝对不适合你之后,你才应该开始构建自己的协议栈。