3

全部,

所以,我发明了一个简单的协议,我想用它来让客户端与服务器交谈。这是典型的(我认为)三相布局:

  • 连接建立(最终将包括能力协商)
  • 实际数据交换 - 数据包愉快地来回传输',由相应的接收器解释,并相应地作用于它们
  • Connection Teardown - 一方说“不想再”,另一方说“就这样吧”(最终将允许另一方发送一些数据直到完成,而不是简单地关闭对话)

该框架是一个简单的设置:服务器执行 java.net.ServerSocket.accept() 并启动一个线程来处理客户端的传入连接,该客户端创建一个 java.net.Socket() 到服务器所在的主机/端口在等待。双方使用 java.io.InputStream 和 java.io.OutputStream 并互相喷出数据,组装传出和解析传入的消息。很好,到目前为止。

到目前为止,该协议是硬编码的。连接建立和拆除几乎没问题,而数据交换部分——我想是全双工的——几乎是一团糟。

所以,我想,让我们做一个好方法,并使用同名的设计模式来设置状态机。我非常清楚服务器和客户端的状态分别应该是什么,发生转换应该发生什么样的事件,以及发生转换时应该采取什么行动。这看起来不错——在纸面上,就是这样。在实践中,我遇到了几个我无法在纸上解决的问题。

特别是,状态机的输入......有点多样化。我怎么可能同时写入数据、读取数据和检查连接(它可能已关闭或已断开)?此外,第 1 和第 3 阶段应该设置计时器,以避免潜在的无限等待答案的时间。

因此,我将不胜感激任何可以弥合理论状态机和代码状态机之间差距的帮助。

顺便说一句,我也可以阅读 C/C++/C# - 无需翻译成 Java(这是我正在使用的)。

4

1 回答 1

0

您的机器的状态需要按“连接”存储

每个连接的客户端可能处于不同的状态。因此,如果您有一个对象跟踪您的状态,那么每个连接都会有一个该对象的实例。

如果您有兴趣,我实际上写了一个小库,它从状态机中抽象出几乎所有内容。那里还有一些测试代码应该向您展示如何工作。 状态机代码

它做了一些你可能会忘记的事情,比如确保不是“有效”的状态转换实际上是一个错误而不是可能被遗漏,并且记录状态转换是免费的。

附言。(任何人)如果你看到它并且不喜欢它——请告诉我为什么。我想让它对任何人都可用。

于 2008-11-18T22:10:22.290 回答