我正在用Java编写一个基于文本的小型游戏服务器。令人惊讶的是,telnet协议比预期的要复杂得多,尤其是它们使用“紧急”或“ 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标记。
更新-回顾了telnet protocol spec之后,丢失OOB通知的效果似乎不会停止。 Telnet的“同步”机制需要发送OOB通知,并向常规流添加“ DATA MARK”命令。它告诉接收端可以丢弃数据(但不能使用telnet命令),直到看到“ DATA MARK”为止。
如果接收端错过了(或忽略了)OOB标记,那么最终结果是它不会忽略数据。那是“最无害的”行为。不理想...但是并不能阻止telnet正常工作。
幸运的是(如@EJP所指出的),这些天很少使用TCP OOB通知机制。因此,Java对它的有限支持几乎没有关系。
还值得注意的是,处理OOB通知不仅仅是Java问题。显然,(本机/ C)套接字API的不同实现以不兼容的方式处理它。
参考:Protocol-Independent Out-of-Band Data.
最好的建议是,如果可能的话,完全避免OOB。当然不要将其设计成新协议。