0

我正在编写一个 java 小程序,它将打印 telnet 客户端发送到连接的内容。不幸的是,客户端拆分为 1448 个字符。

被证明是一个问题的代码:

char[] l = new char[5000];
Reader r = new BufferedReader(new InputStreamReader(s.getInputStream(), "US-ASCII"));
int i = r.read(line);

我无法更改 telnet 客户端读取内容的来源,所以我希望这是上述三行的问题。

4

2 回答 2

4

您期望从 TCP 层获取 telnet 协议数据单元。它只是不那样工作。您只能从实现 telnet 协议的代码中提取 telnet 协议数据单元。TCP 层数据字节的分段是任意的,高层负责重建协议数据单元。

您看到的行为是正常的,除非您正在诊断性能问题,否则您应该完全忽略在 TCP 级别拆分数据的方式。

于 2012-05-04T01:37:34.477 回答
1

您一次只能获得 1448 个字节的原因是底层协议将传输划分为数据包。通常,此大小约为 1500,并且有一些字节用于记账,因此您会留下 1448 字节的块。协议不保证如果您在“单次”中发送 X 字节,客户端将在单次中接收 X 字节(例如,对接收方法的一次调用)。

正如在上面的评论中已经提到的,由接收程序以对客户端有意义的方式重新组装这些数据包。通常,您执行接收并将接收到的数据附加到某个缓冲区,直到找到商定的“数据块结束”标记(例如换行符、换行符、回车符、某些符号不会出现在数据等中)。

如果服务器是真正的 telnet 服务器——它的输出可能是基于行的(例如,单个数据块以“行尾”结束:回车和换行字符)。RFC 854 可能会有所帮助——它详细说明了最初指定的 Telnet 协议。

于 2012-05-04T02:03:54.790 回答