V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rizon
V2EX  ›  程序员

nodejs 想要通过 tcp 交互怎么做来实现建立连接时带着参数

  •  
  •   rizon ·
    othorizon · 2019-06-17 17:30:46 +08:00 · 2032 次点击
    这是一个创建于 1977 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要用 nodejs 开发一个后台服务,可以用 telnet 和 nc 这样的命令来通过 tcp 协议来交互。
    但是重点是,

    在通过 telnet 或 nc 请求后,可以直接带着一个参数到后台服务,后台服务可以直接根据参数来做不同的反馈,而不是在打开连接后,再从终端来交互的方式去传递参数。

    之所以想做这个是想要实现上传数据。
    客户端通过 cat file|nc locahost 8080,把数据传送到服务端,但是所有人都使用这个命令,我需要有一个参数来识别上传的数据的种类。
    我目前可以想到的就是对数据做一下处理:echo 'data'|xargs echo "data_type\n"|nc locahost 8080
    但是这太蠢了啊。。 求大佬支招


    或者是这个问题:TCP 协议能使用 url 这样的东西来区分不同的请求路径吗?后台根据不同 url 来做不同响应??

    也许这是个很蠢的问题哈,不耻下问哈,确实不太懂

    13 条回复    2019-06-18 17:41:54 +08:00
    ouyangbin81076
        1
    ouyangbin81076  
       2019-06-17 17:56:09 +08:00
    http 协议多好用,为什么要用 tcp,tcp 本身没有携带这种功能。
    而且你可以 curl 命令上传文件到 node 的 http 服务器来处理批量任务
    或者用
    cat file | while read line; do curl "localhost:8080/$line"; done;
    mango88
        2
    mango88  
       2019-06-17 17:56:21 +08:00
    ```
    在 tcp 连接建立之前, 应用程序是感受不到的

    类似于 url 参数 是在 tcp 连接建立之后,服务器根据应用层协议的不同做出的响应。

    你可以基于 nc 封装一层,比如:nc-example host port filepath fileType

    执行这个命令之后,程序发起 tcp 连接,完成与服务端握手。
    第一条信息可以发送文件类型,后面开始发送文件内容等等,这一般就称作应用层协议,需要自己协商定义
    ```
    rockyou12
        3
    rockyou12  
       2019-06-17 17:59:17 +08:00
    直接用 http 不就行了 ……而且 http2 非常快了,grpc 都是基于 http2 的
    rizon
        4
    rizon  
    OP
       2019-06-17 18:18:46 +08:00
    @ouyangbin81076 #1
    @rockyou12 #3
    说的也是啊,http 协议,也可以用过管道来传输流数据啊。唉 傻了。。

    @mango88 #2 嗯嗯谢谢哈 知道了
    rizon
        5
    rizon  
    OP
       2019-06-17 18:33:31 +08:00
    @ouyangbin81076 #1 并不可以啊,,curl 不能流的方式上传数据啊
    liuguang
        6
    liuguang  
       2019-06-17 18:37:17 +08:00
    tcp 定义好数据传输格式就好了,就像网游一样,都有规定好的数据结构、
    ouyangbin81076
        7
    ouyangbin81076  
       2019-06-17 18:58:05 +08:00
    @rizon
    curl localhost:8081 -F "file=@myfile" -X POST
    这个会以 multipart/form-data 方式上传文件,
    有个 -d 参数配合 cat xargs 也能上传,不过哪个碰到空格单引号之类的特殊字符很容易就 GG 了
    des
        8
    des  
       2019-06-17 19:00:48 +08:00 via Android
    @rockyou12
    纯 http 用 http2 还是不多的吧,大都是 https + http2
    没太明白这几个的关系,希望能懂
    rockyou12
        9
    rockyou12  
       2019-06-17 21:09:07 +08:00
    @des 理论上其实 http2 并不需要 tls,但基本实现都要求要用 tls。有些语言有无 tls 的 http2 实现,像 go 有个 h2c 就可以
    opengps
        10
    opengps  
       2019-06-17 21:28:42 +08:00
    建立连接只有个 remoteip 和 port,发个信息包识别出来才是有效通信
    des
        11
    des  
       2019-06-17 22:00:26 +08:00 via Android
    @rockyou12
    就是说的这个啊,无 tls 的 http2 根本没有多少支持,更何况 lz 问的是 nodejs
    rockyou12
        12
    rockyou12  
       2019-06-18 09:21:11 +08:00
    @des 哦?虽然我不做 nodejs 开发,但是查询文档还是会的,很明显 nodejs 官方就支持没有 tls 加密的 HTTP2,https://nodejs.org/api/http2.html#http2_http2_createserver_options_onrequesthandler
    julyclyde
        13
    julyclyde  
       2019-06-18 17:41:54 +08:00
    这是课本基础知识啊

    现在的人都不好好学习就出来写程序了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1040 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:14 · PVG 06:14 · LAX 14:14 · JFK 17:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.