2015-05-17 1 views
0

Я пишу небольшой текстовый игровой сервер в Java. Протокол telnet является более сложным, чем ожидалось, и, в частности, они используют данные «Срочно» или «OOB».Данные OOB при реализации сервера протокола Telnet в Java

Я пытаюсь понять, что может быть потеряно, если я либо игнорирую данные OOB, либо если использование «setOOBInline (true)» потеряет контекст и вызовет двусмысленность.

ответ

2

Это сложная проблема.

  • Если вы установили OOB inlining на false, вы потеряете уведомление.
  • Если вы установили OOB inlining в true, они потенциально могут быть введены в середине чего-то другого.

Одним из возможных решений является ведущим при условии, этот ответ:

Видимо, 6,0 кодовая Tomcat имеет JNI implementation of sockets, который обрабатывает OOB по-разному. Похоже, вы можете использовать atMark(...), чтобы проверить, только что сокет только что получил маркер OOB.


UPDATE - После рассмотрения telnet protocol spec, кажется, что эффект потери уведомления OOB не будет шоу-стоппер. Механизм «synch» Telnet влечет за собой отправку уведомления OOB и добавление команды «DATA MARK» в обычный поток. Он сообщает принимающей стороне, что он может удалять данные (но не команды telnet), пока не увидит «DATA MARK».

Если принимающая сторона пропускает (или игнорирует) маркер OOB, тогда чистый эффект заключается в том, что он не игнорирует данные. Это «в основном безвредное» поведение. Не идеально ... но это не останавливает работу telnet.


К счастью (как отметил @EJP) механизм уведомления TCP OOB редко используется в наши дни. Поэтому ограниченная поддержка Java вряд ли имеет значение.

Следует также отметить, что обработка уведомлений OOB - это не просто проблема Java. По-видимому, различные реализации API-интерфейсов (native/C) сокетов обрабатывают его несовместимыми способами.

Самый лучший совет, чтобы избежать OOB полностью, если это возможно. Разумеется, не разрабатывайте его в новые протоколы.

+0

Это правильно. Это не проблема. В течение многих лет у меня была Java Telnet. – EJP

+0

Спасибо. Это тоже была моя интерпретация, хотя я хотел убедиться, что понял. Я прочитал сокеты Java с ответом за пределами диапазона, и, в то же время связанный, мой вопрос больше связан с протоколом TELNET, чем с неадекватным сокетным ядром Socket ;-) – Daniel

+1

@ Daniel Вам нужно только OOB в Telnet, если вы хотите отправить прерывания клавиатуры по провод. Я занимаюсь сетевым программированием около 25 лет, и я никогда не использовал OOB. Я не пропустил это на Java. – EJP