zoukankan      html  css  js  c++  java
  • 用bash做个tcp客户端

     日常做后台服务开发,总免不了要写测试客户端。但是tcp客户端写起来其实还是比较罗嗦的,各种错误返回,各种异常判断。。。。而我们通常并不是要写一个健壮的客户端,我们只是要一个能用的客户端来测试服务端是否正确。
        这里给大家介绍一个简单易用的方法:用bash操作socket!很酷,是不是?

     
        man bash,查找tcp关键字,可以看到这么一段内容:
    1 /dev/tcp/host/port
    2        If host is a valid hostname or Internet address, and port is an integer port number or service  name,  bash attempts to open a TCP connection to the corresponding socket.
        把其中的host和port换成我们要连接的IP和端口,就可以用来建立tcp连接了。如下:
     
    1 exec 3<>/dev/tcp/10.6.221.149/9865
        上面就建立了一个到10.6.221.149:9865的可读可写的socket连接。
        其中3就是指定的连接后的socket fd,由于0、1、2分别被stdin、stdout、stderr占用,所以可用fd最小从3开始。
        ip换成域名其实也是支持的,比如
    1 exec 3<>/dev/tcp/www.xx.com/9865
        注意"<>"前后不要空格,否则会出错。

        发送请求其实很简单,就跟往文件里写数据一样。例如
    1 exec "hello world." >&3
        如果要发HTTP请求,那可以这样:
    1 echo -e "GET /crossdomain.xml HTTP/1.1\r\nHost:www.xx.com\r\n\r\n" >&3
         二进制请求可以这样发:
    1 cat bin_data >&3
        其中bin_data是已经写好的二进制包数据文件。
     
       读取服务器响应跟读文件差不多,可以这样写:
    1 cat <&3
        后台关闭连接以后,cat命令会自动结束。
        如果是读取的二进制内容,可以用hexdump来查看。
    1 hexdump -C -n 31 <&3
        读出来效果如下:

        其中-n是指示hexdump读31个字节就结束。
     
        一个好的编程习惯,建立了连接要记得关闭。
        要关闭上面的socket连接可以这么写:
    1 exec 3>&- # 关闭写,不能再发请求 
    2 exec 3<&- # 关闭读,不能再有返回
        当然,你不关闭其实也不一定有啥大问题,bash脚本执行结束,该连接会自动被关闭。

        下面是我测试用的一个客户端:
    1 #!/bin/sh
    2 exec 3<>/dev/tcp/10.6.221.149/9865
    3 echo "<policy-file-request>" >&3
    4 cat <&3
        瞧,这样的tcp客户端比C语言捣鼓出来的客户端代码少得不是一星半点啊。

        用bash操作udp也差不多的,如法炮制试试吧。
        当然,如果你很能捣鼓,还可以用bash写个服务端试试,捣鼓出来记得把代码分享给我看看。
     
  • 相关阅读:
    SpringBoot2.0 整合 QuartJob ,实现定时器实时管理
    SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
    SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表
    基于 CODING 轻松搞定持续集成
    CODING 受邀参与 DevOps 标准体系之系统和工具&技术运营标准技术专家研讨会
    CODING 受邀参加《腾讯全球数字生态大会》
    CODING 告诉你硅谷的研发项目管理之道系列(6)
    CODING 告诉你硅谷的研发项目管理之道(3)
    CODING 告诉你硅谷项目经理的项目管理之道(2)
    CODING 签约天津大学,助力高校“产学”接轨
  • 原文地址:https://www.cnblogs.com/feisky/p/2247592.html
Copyright © 2011-2022 走看看