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

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

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

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

    一般情况下是 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 也不存在的粘包啊,不会有人自己实现一个协议吧
    oneisall8955
        28
    oneisall8955  
       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   ·   实用小工具   ·   1366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 17:38 · PVG 01:38 · LAX 09:38 · JFK 12:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.