首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现网络协议?

如何实现网络协议?
EN

Stack Overflow用户
提问于 2010-03-16 04:54:24
回答 8查看 16.5K关注 0票数 34

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

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

你有什么建议?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-03-16 04:59:06

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

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

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

"...as我必须写一行又一行的代码来涵盖所有可能的情况。“

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

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

票数 16
EN

Stack Overflow用户

发布于 2010-03-16 05:01:00

设计协议通常都是关于您在其中工作的应用程序空间。例如,http主要用于处理网页、图形和帖子,而FTP主要用于传输文件。

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

票数 6
EN

Stack Overflow用户

发布于 2010-03-16 05:08:03

有限状态机就是你想要的

FSM

因此,您定义了一大堆作为接收者或发送者的状态(idle、connecting_phase1、connecting_phase2、packet expected等)

然后定义所有可能的事件(packet1到达,网络关闭,...)

最后,你有一个表,上面写着‘当在状态x和事件n中发生时,执行函数并转换到状态q’-对于每个状态和事件(许多将为null或dups)

编辑-如何制作有限状态机(草图)

代码语言:javascript
复制
 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;

我确信这篇文章充满了无效的语法--但我希望您能理解其中的含义

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2450408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档