`
换个号韩国红果果
  • 浏览: 49074 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

tcp 中fsm简化版的编写

    博客分类:
  • web
阅读更多
fsm 是当前状态+输入=末状态

参数表
Format is INITIAL_STATE: EVENT -> NEW_STATE
CLOSED: APP_PASSIVE_OPEN -> LISTEN

CLOSED: APP_ACTIVE_OPEN  -> SYN_SENT

LISTEN: RCV_SYN          -> SYN_RCVD

LISTEN: APP_SEND         -> SYN_SENT

LISTEN: APP_CLOSE        -> CLOSED

SYN_RCVD: APP_CLOSE      -> FIN_WAIT_1

SYN_RCVD: RCV_ACK        -> ESTABLISHED

SYN_SENT: RCV_SYN        -> SYN_RCVD

SYN_SENT: RCV_SYN_ACK    -> ESTABLISHED

SYN_SENT: APP_CLOSE      -> CLOSED

ESTABLISHED: APP_CLOSE -> FIN_WAIT_1

ESTABLISHED: RCV_FIN   -> CLOSE_WAIT

FIN_WAIT_1: RCV_FIN     -> CLOSING

FIN_WAIT_1: RCV_FIN_ACK -> TIME_WAIT

FIN_WAIT_1: RCV_ACK     -> FIN_WAIT_2

CLOSING: RCV_ACK -> TIME_WAIT

FIN_WAIT_2: RCV_FIN -> TIME_WAIT

TIME_WAIT: APP_TIMEOUT -> CLOSED

CLOSE_WAIT: APP_CLOSE -> LAST_ACK

LAST_ACK: RCV_ACK -> CLOSED





我的处理方案  当前状态+输入=末状态  2个状态一个输入恰好可以构成一个字符串用|连接,刚好组成一个数组,再遍历数组各个元素搜索状态,搜索输入  若匹配则将第3个赋予state
代码如下:
var FSMData=[//构建数组
'CLOSED | APP_PASSIVE_OPEN | LISTEN',

'CLOSED | APP_ACTIVE_OPEN |SYN_SENT',

'LISTEN| RCV_SYN         | SYN_RCVD',

'LISTEN| APP_SEND        | SYN_SENT',

'LISTEN| APP_CLOSE        | CLOSED',

'SYN_RCVD| APP_CLOSE      | FIN_WAIT_1',

'SYN_RCVD| RCV_ACK        | ESTABLISHED',

'SYN_SENT| RCV_SYN        | SYN_RCVD',

'SYN_SENT| RCV_SYN_ACK    | ESTABLISHED',

'SYN_SENT| APP_CLOSE      | CLOSED',

'ESTABLISHED| APP_CLOSE | FIN_WAIT_1',

'ESTABLISHED| RCV_FIN   | CLOSE_WAIT',

'FIN_WAIT_1| RCV_FIN     | CLOSING',

'FIN_WAIT_1| RCV_FIN_ACK | TIME_WAIT',

'FIN_WAIT_1| RCV_ACK     | FIN_WAIT_2',

'CLOSING| RCV_ACK | TIME_WAIT',

'FIN_WAIT_2|RCV_FIN | TIME_WAIT',

'TIME_WAIT|APP_TIMEOUT | CLOSED',

'CLOSE_WAIT| APP_CLOSE | LAST_ACK',

'LAST_ACK| RCV_ACK | CLOSED']

function traverseTCPStates(eventList){
  var state = "CLOSED";  // initial state, always
  for(var i=0;i<eventList.length;i++)
	{
		
		if(! judge (eventList[i]) )  return state;
//若返回false,不再进行,返回
	}
  return state;//最终返回
  
  
  function judge(_eventListPara){
//判断该输入是否有匹配,有的话更改state,返回//true,无返回false  更改state为error
	

		
	for(var j=0; j<FSMData.length; j++)
		{
		FSMData [j]=FSMData [j].replace(/\s+/g,'');//去空格因为数组不会自动去空格
		var arr=FSMData [j].split("|");//剥离三个东东
		if(arr[0]==state && arr[1]==_eventListPara) 
			{
				 state= arr[2];
				 
				 return true;
			}
		}
		
		state ='ERROR';
		return false;
		
	}
}	





分享到:
评论

相关推荐

    akka java document

    - **单元测试:** 如何编写 Actor 的单元测试。 - **集成测试:** 如何测试 Actor 系统的整体行为。 #### 四、带有 Lambda 支持的 Actors **4.1 带有 Lambda 支持的 Actors** - **Lambda 表达式:** 使用 Lambda ...

    游戏脚本高级编程附带资料.7z

    游戏脚本高级编程是游戏开发领域中的一个重要环节,它涉及到如何使用特定的编程语言和工具来创建、管理和优化游戏逻辑。在这个压缩包“游戏脚本高级编程附带资料.7z”中,我们可以期待找到一系列关于游戏脚本的深度...

    scala akka

    - **Actors (Java with Lambda Support)**:Java版的Actor支持lambda表达式,简化了代码编写。 - **FSM (Java with Lambda Support)**:有限状态机是控制复杂逻辑的一种有效方式,Java版本同样支持lambda表达式。 #...

    akka的教学

    这部分内容进一步探讨了如何在 Java 中使用 Lambda 表达式来简化 Actor 的定义和消息处理逻辑。 ##### 9.4 FSM (Java with Lambda Support) 这部分内容介绍了如何在 Java 中使用 Lambda 表达式来简化有限状态机 ...

    Akka Scala文档

    - **状态机模式**:使用 FSM 模式简化 Actor 的逻辑。 - **事件处理**:定义不同状态下对消息的响应。 ##### 3.8 持久化 - **持久化机制**:记录 Actor 的状态更改。 - **恢复状态**:从日志中恢复 Actor 的历史...

Global site tag (gtag.js) - Google Analytics