Linux网络编程:状态机

  • 状态机基本概念介绍
    • 状态机的特征
    • 状态机的要素
    • 注意!
    • 为什么在网络编程中需要状态机?

状态机基本概念介绍

首先我们简单的介绍一下状态机的基本概念
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。
说人话就是在一个时刻内,只会存在一种状态,但是达到触发条件,就会切换状态。

状态机的特征

  • 状态总数是有限的
  • 任一时刻,只处在一种状态之中
  • 某种条件触发后,会从一种状态转变到另一种状态
  • 事物状态变化是有规则的,A状态可以变换到B,B可以变换到C,A却不一定能变换到C
  • 同一种行为,可以将事物从多种状态变成同种状态,但是不能从同种状态变成多种状态

状态机的要素

状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

  • 现态:是指当前所处的状态。
  • 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
  • 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
  • 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

注意!

  • 避免把某个“程序动作”当作是一种“状态”来处理
    那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
  • 状态划分时漏掉一些状态,导致跳转逻辑不完整
    所以维护上述一张状态表就非常必要,而且有意义了。从表中可以直观看出那些状态直接存在跳转路径,那些状态直接不存在。如果不存在,就把对应的单元格置灰。 每次写代码之前先把表格填写好,并且对置灰的部分重点review,看看是否有“漏态”,然后才是写代码。

为什么在网络编程中需要状态机?

因为写出大量的if else使得代码无比丑且高冗余

Linux网络编程:状态机相关推荐

  1. 计算机网络(二)Linux网络编程

    layout: post title: 计算机网络(二)Linux网络编程 description: 计算机网络(二)Linux网络编程 tag: 计算机网络 文章目录 资源共享 Linux高性能服务 ...

  2. 【Linux网络编程】Nginx -- 模块开发(upstream / subrequest)

    [Linux网络编程]Nginx -- 模块开发(upstream / subrequest) [1]upstream VS subrequest 简介 upstream 为访问上游服务器,它把Ngi ...

  3. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

  4. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  5. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  6. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  7. [Linux网络编程学习笔记]套接字地址结构

    好久没有看那Linux网络编程这本书了,今天看到了重点部分-TCP套接字.下面先来看看套接字的地址结构 Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构.在头文件<li ...

  8. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  9. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

  10. 基于UDP客户端服务器的编程模型-linux网络编程

    坚持在代码中注释,边读代码边学习Linux网络编程 使用到的发送函数原型: #include <sys/types.h>#include <sys/socket.h>ssize ...

最新文章

  1. security面试_精选41 道 Spring Boot 面试题,附答案!
  2. 【深度学习】深入浅出神经网络框架的模型元件(常用层和卷积层)
  3. 月份java题_Java基础50道经典练习题(14)——求日期
  4. 【HDOJ】1150 Machine Schedule
  5. jsr303 spring_使用Spring和JSR 303进行方法参数验证
  6. 如何在邮件系统中使用自己的域名?
  7. Socket通信客户端设计(Java)
  8. [日常] 算法-单链表的创建-尾插法
  9. Windows输入体验是什么,Windows11输入体验在哪里
  10. 完整的企业机房设计(上)
  11. 晶振PCB layout注意事项
  12. 104键键盘 按键码表
  13. (Cys-RGD)包被CdTe量子|3-巯基丙酸(MPA)包被近红外发光CdTe量子
  14. java float 判断整数_判断一个数是否是整数
  15. NBA篮球运动员大数据分析决策支持系统
  16. Java,php,运维工程师转型大数据开发怎么样?你属于哪一类?
  17. 微信小程序二手汽车拍卖系统丨可以android studio运行
  18. springBoot+thymeleaf框架实现cms内容管理和商城系统
  19. vue html 格式化,解决在写Vue时,格式化代码 属性自动换行的问题
  20. [内核安全4]内核态Rootkit之IDT Hook

热门文章

  1. 3dmax报错信息大全,最全解决方案来了
  2. 全解电磁流量计功能和精度性能
  3. 成功解决python.exe 无法找到入口 无法定位程序输入点
  4. 关于IE11浏览器不能正确调用ActiveX控件的解决办法
  5. 灰度决策--如何解决棘手复杂问题
  6. kdj买卖指标公式源码_买卖点KDJ版指标详解 通达信通达信KDJ
  7. tcp 粘包是怎么产生的?
  8. 附加:在在下部分区/县(数据表)
  9. 牛x!基于Springboot 2.0 + LayUI开发的物流管理系统(已开源)
  10. 【企业微信】h5调试面板