前端与后台通过 socket 提供接口的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
awanganddong
V2EX    程序员

前端与后台通过 socket 提供接口的问题

  •  
  •   awanganddong 2020-10-28 09:53:51 +08:00 4188 次点击
    这是一个创建于 1808 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景:获取表单里边的实时状态值

    一般情况下是 ajax 轮询通过 http 协议获取接口实时内容

    如果用 socket 来实现的话,

    是不是每个接口,后台都要起一个新的端口来提供连接。

    对于这点,不太清晰。

    31 条回复    2020-10-29 13:39:22 +08:00
    jenlors
        1
    jenlors  
       2020-10-28 09:58:42 +08:00
    可以用 websocket,传输的 json 用一个 key 区分场景。
    xuanbg
        2
    xuanbg  
       2020-10-28 10:01:04 +08:00
    如果用 socket 来实现的话,粘包也许迟到,但不会缺席。
    awanganddong
        3
    awanganddong  
    OP
       2020-10-28 10:01:50 +08:00
    明白了

    就是 switch case 判断
    nnnToTnnn
        4
    nnnToTnnn  
       2020-10-28 10:03:00 +08:00
    @xuanbg 粘包 是什么? 有一说一我用 TCP /UDP 完全没听说过粘包
    xuanbg
        5
    xuanbg  
       2020-10-28 10:04:08 +08:00
    @xuanbg 然后你需要自己设计一个应用层协议来实现表单状态的实时下发。
    azcvcza
        6
    azcvcza  
       2020-10-28 10:04:45 +08:00
    websocket 起一个,然后根据 on('message',(data)=>{})来判断 data 的 type 再进行一系列操作
    nnnToTnnn
        7
    nnnToTnnn  
       2020-10-28 10:05:32 +08:00
    刚查了一下资料 `TCP 是流协议,根本不存在所谓粘包一说。` 我猜应该是应用层没处理好流导致的 @xuanbg #2L
    nnnToTnnn
        8
    nnnToTnnn  
       2020-10-28 10:09:52 +08:00
    TCP 的流协议,哪来的包的说法,这个名词我惊呆了
    xuanbg
        9
    xuanbg  
       2020-10-28 10:12:00 +08:00
    @nnnToTnnn 是的,v2 不是经常出来粘包问题么,所以就调笑了一下。应用不通过应用层协议通信,而是直接往 socket 里怼数据,就会发现对方接受的数据粘在一起无法区分,俗称“粘包”。
    xuanbg
        10
    xuanbg  
       2020-10-28 10:13:18 +08:00
    @nnnToTnnn 所以粘包不仅是一个伪问题,还是一个生造出来的伪概念。
    wysnylc
        11
    wysnylc  
       2020-10-28 10:16:08 +08:00   3
    我说怎么看不到粘包楼,原来早就被我 b 了
    libook
        12
    libook  
       2020-10-28 10:46:14 +08:00
    服务端一个端口可以管理多个客户端的连接,但这个管理需要你自己在程序上做好,比如数据应该经由哪一条连接发给指定的客户端。

    用 WebSocket 吧,很多问题都帮你考虑好了,另外如果你用 Node.js ,Socket.io 这个库帮你把 WebSocket 封装得开箱即用。
    reus
        13
    reus  
       2020-10-28 10:49:41 +08:00 via Android
    Http 也可以 long pull,不用轮询
    zsdroid
        14
    zsdroid  
       2020-10-28 10:54:56 +08:00
    粘包警察会迟到到不会缺席
    shintendo
        15
    shintendo  
       2020-10-28 10:57:04 +08:00
    粘包警察还有三十秒……哦已经到了啊
    selvecui
        16
    selvecui  
       2020-10-28 10:57:17 +08:00
    tcp 粘包很常见啊,应用层做好 magic 字,起始符,结束符就好了,但是哪里比得上 websocket 方便,纯 tcp 有点底层了
    baiyi
        17
    baiyi  
       2020-10-28 10:59:26 +08:00
    看起来是 watch 的场景,可以不用 websocket,直接通过 http 的持久链接来实现,也叫长链接。

    具体可以搜索 HTTP 长链接、HTTP chunk 等关键词
    zczy
        18
    zczy  
       2020-10-28 11:13:25 +08:00
    直接用 Netty 的 websocket 的 example,代码都是现成的
    caoyouming
        19
    caoyouming  
       2020-10-28 11:14:51 +08:00
    粘包是应用层在消息边界上定义有问题吧?
    stephenxiaxy
        20
    stephenxiaxy  
       2020-10-28 11:24:08 +08:00
    @xuanbg 哈哈
    awanganddong
        21
    awanganddong  
    OP
       2020-10-28 12:02:33 +08:00
    @baiyi 项目是基于 php-fpm ,一个 http 长链接就占了一个进程,实现起来不如 socket 来的合适。
    awanganddong
        22
    awanganddong  
    OP
       2020-10-28 12:05:14 +08:00
    des
        23
    des  
       2020-10-28 12:48:11 +08:00 via iPhone
    longpoll sse websocket 都可以做到,你这种比较推荐 sse
    CommandZi
        24
    CommandZi  
       2020-10-28 16:10:58 +08:00
    是不是每个接口,后台都要起一个新的端口来提供连接。
    不是

    一个 socket 链接可以任何二进制数据,为什么要新起链接?
    ISSSSSSS
        25
    ISSSSSSS  
       2020-10-28 16:19:57 +08:00
    Websocket 或者 SSE 。
    dcoder
        26
    dcoder  
       2020-10-28 17:25:59 +08:00
    @awanganddong 楼里各种五花八门的回答,你们是在认证帮楼主么?
    我认证问楼主个问题,现在 JS web 前端可以直接用 TCP/UDP socket 和后端通信了 ??
    我记得以前是不能的. 如果不能,这个问题本身就不成立. 只能用 WebSocket (over TCP), 不需要你管理 socket ports.
    maplelin
        27
    maplelin  
       2020-10-28 18:07:40 +08:00
    我寻思 websocket 也不存在的粘包啊,不会有人自己实现一个协议吧
    itechify
        28
    itechify  
    PRO
       2020-10-28 18:37:07 +08:00 via Android
    逐渐偏离主题,打起来打起来
    awanganddong
        29
    awanganddong  
    OP
       2020-10-28 20:28:23 +08:00
    乃们啊,就因为粘包打起来了。
    xhinliang
        30
    xhinliang  
       2020-10-28 21:19:05 +08:00
    浏览器能用裸 TCP 么,粘包党?
    哈哈
    muzuiget
        31
    muzuiget  
       2020-10-29 13:39:22 +08:00
    不懂粘包,说明混 V2EX 不够久(狗头)。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     940 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 22:06 PVG 06:06 LAX 15:06 JFK 18:06
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86