使用 Telnet 进行 TCP 交互

很多的应用程序都是通过TCP协议进行数据传输的,比如 Memcached,Redis,Mysql 等等。有的时候就需要直接通过 TCP 进行交互或者调试。

最近在使用 Beanstalk 的时候就发现了一些问题,当 Beanstalk 的 tube 是空的时候,消费端的连接持续超过2到3小时之后,再往这个tube扔job,消费端就再也收不到了,但是消费端却还是显示连接着,没有报错退出也收不到任何消息。起初我以为是Pheanstalk这个PHP客户端的问题,毕竟这个客户端用的人还是蛮多的,但是实现比较粗糙。后来通过telnet才发现原来是Beanstalk的问题,在telnet连接时候,空tube连接持续超过2到3小时之后也收不到任何消息,原本Beanstalk也已经好几年没有维护了,唉,到处都是坑,也没有必要去提issue了,自己添加了重连机制,也算是解决了这个问题。

使用telnet非常简单,以redis为例,直接:telnet localhost 6379就进入交互界面:

[root@VM_0_9_centos ~]# telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

直接输入redis命令:

set name redis
+OK
get name
$5
redis

通过socket可以连接TCP,然后组装相应的命令发送给应用程序,然后解析返回的数据,这就是Pheanstalk,Predis所做的事情,因此只要知道相应的TCP协议与命令格式,可以很容易编写客户端,这个是与语言无关的。