这是一个一般性的问题。我不是在寻找最好的答案,我只是想让你表达你最喜欢的做法。
我想用Java实现一个网络协议(但这是一个相当普遍的问题,我在C++中遇到了同样的问题),这不是我第一次这样做了,因为我以前做过这样的事情。但我想我错过了一个实现它的好方法。事实上,通常它都是关于在主机之间交换文本消息和一些字节缓冲区,存储状态并等待下一条消息到来。问题是,我通常以一堆switch和或多或少复杂的if语句结束,这些语句对不同的状态/消息做出反应。整个事情通常会变得很复杂,很难控制。更不用说有时会出现一些“盲点”,我的意思是协议的状态没有被覆盖,并且以不可预测的方式运行。我尝试写下一些状态机类,它们以或多或少的智能方式检查每个操作的开始和结束状态。这使得协议的编程变得非常复杂,因为我必须编写一行行代码来涵盖每一种可能的情况。我想要的是一个很好的模式,或者是用于编程复杂协议的最佳实践,易于维护和扩展,并且非常可读性强。
你有什么建议?
发布于 2010-03-16 04:59:06
请阅读状态设计模式,了解如何避免大量的switch语句。
“有时出来的东西有一些”盲点“,我的意思是协议的状态没有被覆盖……”
状态可以帮助避免出现差距。它不能保证一个好的设计,你仍然必须这样做。
"...as我必须写一行又一行的代码来涵盖所有可能的情况。“
这不应该被认为是负担或问题:您必须编写代码行来涵盖每一种可能的情况。
状态可以提供帮助,因为您可以利用继承。它不能保证一个好的设计,你仍然必须这样做。
发布于 2010-03-16 05:01:00
设计协议通常都是关于您在其中工作的应用程序空间。例如,http主要用于处理网页、图形和帖子,而FTP主要用于传输文件。
因此,简而言之,首先,您应该确定您所在的应用程序空间,然后定义需要采取的操作。最后,在你开始设计你的实际协议之前,你应该认真地,认真地寻找另一个能做你想做的事情的协议栈,并且避免实现一个协议栈。只有在你确定其他预先构建的东西对你绝对不起作用之后,你才应该开始构建你自己的协议栈。
发布于 2010-03-16 05:08:03
有限状态机就是你想要的
FSM
因此,您定义了一大堆作为接收者或发送者的状态(idle、connecting_phase1、connecting_phase2、packet expected等)
然后定义所有可能的事件(packet1到达,网络关闭,...)
最后,你有一个表,上面写着‘当在状态x和事件n中发生时,执行函数并转换到状态q’-对于每个状态和事件(许多将为null或dups)
编辑-如何制作有限状态机(草图)
struct FSMNode
{
int m_nextState;
void (m_func*);
}
FSMNode states[NUMSTATES][NUMEVENTS]=
{ // state 0
{3, bang}, // event 0
{2,wiz},
{1, fertang}
}
{
{1, noop}, // event 0
{1, noop},
{3, ole}
}
.......
FSMNode node = states[mystate][event];
node.m_func(context);
mystate = node.m_nextState;我确信这篇文章充满了无效的语法--但我希望您能理解其中的含义
https://stackoverflow.com/questions/2450408
复制相似问题