我正在用Java编写一个基于文本的游戏服务器。 telnet协议比预期的要复杂得多,特别是它们使用" Urgent"或者" OOB"数据。
如果我要么忽略OOB数据,要么使用" setOOBInline(true)"我很难理解可能会丢失的内容。将失去背景并引起歧义。
答案 0 :(得分:2)
这是一个难题。
false
,则会丢失通知。true
,则可能会将其注入其他内容。一个可能的解决方案是这个答案提供的主角:
显然,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问题。显然,(native / C)套接字API的不同实现以不兼容的方式处理它。
最好的建议是尽可能完全避免OOB。当然不要将它设计成新的协议。