• 请不要在回答技术问题时复制粘贴 AI 生成的内容
awanganddong
V2EX  ›  程序员

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

  •  
  •   awanganddong · Oct 28, 2020 · 4557 views
    This topic created in 2032 days ago, the information mentioned may be changed or developed.

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

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

    如果用 socket 来实现的话,

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

    对于这点,不太清晰。

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

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

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

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

    一个 socket 链接可以任何二进制数据,为什么要新起链接?
    ISSSSSSS
        25
    ISSSSSSS  
       Oct 28, 2020
    Websocket 或者 SSE 。
    dcoder
        26
    dcoder  
       Oct 28, 2020
    @awanganddong 楼里各种五花八门的回答,你们是在认证帮楼主么?
    我认证问楼主个问题,现在 JS web 前端可以直接用 TCP/UDP socket 和后端通信了 ??
    我记得以前是不能的. 如果不能,这个问题本身就不成立. 只能用 WebSocket (over TCP), 不需要你管理 socket ports.
    maplelin
        27
    maplelin  
       Oct 28, 2020
    我寻思 websocket 也不存在的粘包啊,不会有人自己实现一个协议吧
    itechify
        28
    itechify  
    PRO
       Oct 28, 2020 via Android
    逐渐偏离主题,打起来打起来
    awanganddong
        29
    awanganddong  
    OP
       Oct 28, 2020
    乃们啊,就因为粘包打起来了。
    xhinliang
        30
    xhinliang  
       Oct 28, 2020
    浏览器能用裸 TCP 么,粘包党?
    哈哈
    muzuiget
        31
    muzuiget  
       Oct 29, 2020
    不懂粘包,说明混 V2EX 不够久(狗头)。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5631 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 92ms · UTC 03:36 · PVG 11:36 · LAX 20:36 · JFK 23:36
    ♥ Do have faith in what you're doing.