用Telnet客户端调试TCPSocket程序

以前经常用Telnet去水木,一直以为Telnet是一个字一个字的发送,估计协议挺复杂。嗯,现在也没有认真看看相关的RFC,所以Telnet的协议我还是不甚了解,但是最近写程序时被高人指点用Telnet测一下,发现Telnet居然如此便利和简单。
其实Telnet除了逐字发送之外,还有逐行发送的方式。其实这个无所谓,因为TCP协议的设计在思想上是想实现一种流的模型,让用户把数据当成流使用,而不是一个报文一个报文地处理,特别是对于比较高级的语言如Java和Ruby来说,这一点特别明显。要说区别还是有,如果逐字发送,那么Telnet客户端用户输入的更正,比如退格什么的,就必须由服务端自己处理;如果逐行发送,Linux下的telnet程序是客户端自己处理的,而Win32自带的telnet客户端仍是最后一起发送给服务器端处理(不过好像是可以设置的)。
Telnet客户端希望在成功连接到服务器端口是,服务器应先发送一些连接成功之类的文本给客户端。特别是Win32自带的telnet,如果连接之后服务器不发信息,客户端的用户输入的回显就不会打开,不管你输入什么都看不见(这一点也是可以设置的)。
Telnet协议设计的一个中心思想服务器端要彻底模拟一个本地的term,尽管很有可能服务器端连接的远程term和本地二者平台的规范存在差异;也就是说一个远程的term,无论它是什么平台,他发给服务器端的任何内容,都会被服务器端转换成服务器端所在平台的规范。要实现这一点,就要求客户端将用户输入转换为Telnet的规范,服务器端将遵从Telnet规范的接收内容转换为当前平台的规范。典型的就是行结束符的处理,Telnet规范中行结束符是\r\n;比如现在服务器端在Mac平台(行结束符\r),客户端在Linux平台(行结束符\n),那么Linux的客户端就应该把用户的回车\n转换为\r\n传输,Mac的服务器端再把\r\n转换为\r来模拟一个本地的term。
所以如果你写的程序希望能用Telnet调试,记得使用\r\n当行结束符。
这一点很像网络字节序的问题,XXX规定,网络上传输的所有的16位或者32位数据都得按正序排列,所以我们在反序排列的PC机上写网络程序经常需要转换字节序再发送。(原谅我分不清大端小端是什么意思,这两个二逼词的表义如同博客的“上一篇”和“下一篇”的链接。)网络上的这个规范是为了统一理解底层意义上的数据,Telnet的规范是为了统一理解高层意义上的文本。
恩。差不多了。还有一点,一般Telnet的客户端都有普通的Input模式和设置、命令客户端的Commnad模式,前者切换到后者,一般按Ctrl+](这个叫Escape character,可以设置),后者切换到前者一般直接按回车就行。
至于用途,比如Win32的Telnet的命令模式可以set localecho打开用户输入的回显,你也可以发现命令模式一般是有行提示符的。

你可能感兴趣的:(新手开发linux,linux开发)