V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xkxy
V2EX  ›  程序员

用 Java 实现 500 人及时聊天的功能,是不是只有 WebSocket 这种实现方式呢?求大佬给个思路

  •  1
     
  •   xkxy · 2021-01-07 10:21:41 +08:00 · 5955 次点击
    这是一个创建于 1445 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题。

    第 1 条附言  ·  2021-01-07 14:17:28 +08:00

    我这个系统是web端的,看大家的意思webSocket就够了。

    另外问一下,数据存储呢?有什么好的建议嘛?MySql???

    26 条回复    2021-01-08 02:26:34 +08:00
    jiaokang
        1
    jiaokang  
       2021-01-07 10:24:07 +08:00
    MQTT
    wysnylc
        2
    wysnylc  
       2021-01-07 10:29:04 +08:00
    Leigg
        3
    Leigg  
       2021-01-07 10:34:45 +08:00 via iPhone
    当然,不是了,了解一下长连接技术。
    woodensail
        4
    woodensail  
       2021-01-07 10:55:49 +08:00
    前端常用的推送方式分 4 种
    1:短轮询,也就是定期刷新,实时性无法保证,不适用于 IM
    2:长轮询,发起请求后服务端挂起,等有通知后返回数据。前端收到后立刻发起下一次请求。改动较小
    3:长连接,发起请求后服务端利用该连接多次返回数据。改动较大
    4:websocket,双工通信,体验完爆上面所有。开发难度也不大。
    manami
        5
    manami  
       2021-01-07 11:13:27 +08:00
    java 直接上 netty
    whileFalse
        6
    whileFalse  
       2021-01-07 11:43:27 +08:00
    如果你客户端是 web 页面,只能用 websocket (轮询或长链接也能实现,但效果性能差很多)
    如果客户端是 native,选择就多很多。
    xxxy
        7
    xxxy  
       2021-01-07 11:57:10 +08:00
    500 个 websocket 链接压力不大
    yfwl
        8
    yfwl  
       2021-01-07 11:58:04 +08:00
    调用第三方 SDK,万物皆可 API !
    lancelock
        9
    lancelock  
       2021-01-07 12:06:05 +08:00
    取决于你客户端
    opengps
        10
    opengps  
       2021-01-07 12:18:00 +08:00
    并没有限制,哪怕用轮训也并不是说不可以。websocket 只是在浏览器端比较轻巧而已。
    如果要做的客户端,那么显然直接使用 socket 更方便
    难点不在客户端,而在于服务端,怎么支持不限制(高支持≈不限制)客户端数量,各种异常处理,转发消息,头一次接手的人还是有很多细节要处理的
    hyxj1229
        11
    hyxj1229  
       2021-01-07 12:26:07 +08:00
    mango88
        12
    mango88  
       2021-01-07 14:19:33 +08:00
    openfire
    gochat
        13
    gochat  
       2021-01-07 14:22:26 +08:00
    genal
        14
    genal  
       2021-01-07 14:44:29 +08:00
    https://github.com/genaller/genal-chat 有个现成的 web 聊天系统,内网或者带宽够五百人是可以的,fiora 也不错
    firechat
        15
    firechat  
       2021-01-07 14:50:16 +08:00   ❤️ 1
    IM 要想做好需要花费非常多时间和精力,如果没有办法投入大量人力和时间,最好别自己来开发。可以选用云通讯平台,直接使用他们的 sdk 就行,也可以选择使用我们的 https://github.com/wildfirechat 私有部署,需要有一定的定制开发和运维能力,需要付费,可以先试用后购买。
    hantsy
        16
    hantsy  
       2021-01-07 14:52:05 +08:00
    web socket 处理这点小意思啊,不过后面的 Web socket session 处理需要另外缓冲处理( Redis 等)。客户端也容易,Android,WebSocket 都是很容易支持。


    简单的 WebSocket 例子:

    https://github.com/hantsy/angular-spring-websocket-sample

    RSocket 例子:

    https://github.com/hantsy/angular-spring-rsocket-sample

    SSE+ 普通 HTTP Post (这个比较简单,也容易处理):

    https://github.com/hantsy/angular-spring-sse-sample
    hantsy
        17
    hantsy  
       2021-01-07 15:00:00 +08:00
    喜欢挑战,可以试用 RSocket,各种语言支持也很好。

    https://github.com/rsocket
    hantsy
        18
    hantsy  
       2021-01-07 15:03:44 +08:00
    另外对于聊天这种程序,要求即时响应,文本居本,Key/value 数据库是更好的选择。

    我开发过一个 Angular+Firebase 项目,Firebase 本身的 JS API 都基于 WebSocket 协议的,所以感觉这也是个不错的选择。Firebase 官方还有专门的 Chat UI 扩展。
    chinvo
        19
    chinvo  
       2021-01-07 15:12:52 +08:00 via iPhone
    直接 ejabberd
    oxromantic
        20
    oxromantic  
       2021-01-07 15:21:16 +08:00
    500 人聊天?自己做还不如花钱一个月 999 有成吨的供应商
    azuremem
        21
    azuremem  
       2021-01-07 16:48:56 +08:00
    rabbitmq 貌似可以
    iintothewind
        22
    iintothewind  
       2021-01-07 16:53:37 +08:00 via iPhone
    用 mqtt 就可以,可以参考我的:
    https://home-chat.vercel.app
    不过不是 Java 项目,后端不需要代码,只需要 mqtt 的服务就可以了
    hantsy
        23
    hantsy  
       2021-01-07 17:25:10 +08:00
    @azuremem RabbitMQ + STOMP + SockJS 这是个经典组合。除了 NodeJS 的 SocketIO 外。
    angryfish
        24
    angryfish  
       2021-01-07 18:40:49 +08:00 via iPhone
    500 人,直接短轮询
    Goat121
        25
    Goat121  
       2021-01-07 23:44:56 +08:00
    500 人随便啥都行,webSocket 最简单。
    上面还有 RabbitMQ 都来了,面试八股文看多了把。
    如果是需要 MQ 的量级,还用这些?
    哪个巨型 IM 不是 tcp/udp 上实现的私有协议啊
    xcstream
        26
    xcstream  
       2021-01-08 02:26:34 +08:00
    mqtt broker 可以单独启动
    java 可以做业务端连接 mqtt 提供服务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:57 · PVG 02:57 · LAX 10:57 · JFK 13:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.