我正在编写一个java applet,它将打印telnet客户端发送给连接的内容。不幸的是,客户端分为1448个字符。
证明存在问题的代码:
char[] l = new char[5000];
Reader r = new BufferedReader(new InputStreamReader(s.getInputStream(), "US-ASCII"));
int i = r.read(line);
我无法更改telnet客户端读取内容的来源,所以我希望这是上述三行的问题。
答案 0 :(得分:4)
您希望从TCP层获取telnet协议数据单元。它只是不起作用。您只能从实现telnet协议的代码中提取telnet协议数据单元。 TCP层的数据字节分段是任意的,更高层的责任是重建协议数据单元。
您看到的行为是正常的,除非您正在诊断性能问题,否则您应该完全忽略数据在TCP级别的分割方式。
答案 1 :(得分:1)
您一次只获得1448字节的原因是底层协议将传输分成数据包。通常,这个大小大约是1500,并且有一些字节用于簿记,所以你留下了1448字节的大块。协议不保证如果您在“单次拍摄”中发送X个字节,客户端将在一次拍摄中接收X个字节(例如,对接收方法的单个调用)。
正如上面的评论中已经指出的那样,它取决于接收程序以对客户端有意义的方式重新组装这些数据包。通常,您执行接收并将您收到的数据附加到某个缓冲区,直到您找到一个商定的“数据块结束”标记(例如行尾,换行符,回车符,某些符号这不会出现在数据等中。)。
如果服务器真的是一个telnet服务器 - 它的输出可能是基于行的(例如,一个数据块以'行尾'终止:回车符和换行符)。 RFC 854可能会有所帮助 - 它详细说明了最初指定的Telnet协议。