在 Java 中实现 Telnet 协议服务器时的 OOB 数据

OOB data when implementing Telnet protocol server in Java

我正在 Java 中编写一个基于文本的小型游戏服务器。 telnet 协议比预期的要复杂得多,特别是它们使用了 "Urgent" 或 "OOB" 数据。

如果我忽略 OOB 数据,或者如果使用 "setOOBInline(true)" 会丢失上下文并导致歧义,我很难理解可能会丢失什么。

这是一道难题。

  • 如果将 OOB 内联设置为 false,则会丢失通知。
  • 如果您将 OOB 内联设置为 true,它们可能会被注入到其他东西的中间。

一个可能的解决方案是这个答案提供的线索:

  • Java sockets with out of band data

显然,Tomcat 6.0 代码库有一个 JNI implementation of sockets 以不同方式处理 OOB。看起来您可以使用 atMark(...) 来测试套接字是否刚刚收到 OOB 标记。


UPDATE - 在查看 telnet protocol spec 后,似乎失去 OOB 通知的效果不会成为阻碍。 Telnet 的“同步”机制需要发送 OOB 通知,并向常规流添加“DATA MARK”命令。它告诉接收端它可以丢弃数据(但不是 telnet 命令),直到它看到“DATA MARK”。

如果接收端错过(或忽略)了 OOB 标记,那么最终效果是它不会忽略数据。这是“基本无害”的行为。不理想...但它不会阻止 telnet 工作。


幸运的是(正如@EJP 指出的那样)现在很少使用 TCP OOB 通知机制。所以 Java 对它的有限支持无关紧要。

同样值得注意的是,处理 OOB 通知不仅仅是一个 Java 问题。显然,(本机/C)套接字 API 的不同实现以不兼容的方式处理它。

最好的建议是尽可能完全避免 OOB。当然不要设计成新的协议。