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

Java 有哪些基于应用层通信协议的框架?

  •  
  •   tctc4869 · 2020-06-28 14:57:42 +08:00 · 4061 次点击
    这是一个创建于 1610 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用基于传输层 tcp 协议的 socket 框架(比如 Netty )要简单的通信,要处理粘半包,如果要考虑传输特殊格式的话剧,那么可以用一用原始的 socket 实现。

    如果考虑多文件(上传下载),要考虑更多的情况,要编写的代码就更多。那么有哪些基于应用层协议的通信框架么,比如 WebSocket,包括客户端与服务端。关于 websocket 框架,java 有哪些呢,服务端与客户端?

    不一定要与 http 服务端程序挂在一个进程里,可能会单独使用。

    第 1 条附言  ·  2020-06-28 16:01:19 +08:00
    客户端可能会用在手机里
    第 2 条附言  ·  2020-06-28 18:54:58 +08:00
    听大家的解释,似乎所谓的“粘半包”现象只是应用层处理设计缺陷漏洞造成的,tcp/ip 本来就没有“粘包”现象。好吧,我知道了。
    45 条回复    2020-06-29 13:29:32 +08:00
    GM
        1
    GM  
       2020-06-28 15:01:32 +08:00   ❤️ 4
    都 0202 年了,还神“粘半包”,tcp 是个流( stream ),搞明白什么叫 stream,再来谈 tcp 通讯。
    tctc4869
        2
    tctc4869  
    OP
       2020-06-28 15:17:54 +08:00   ❤️ 1
    @GM 素质真好啊。
    RoyceLee
        3
    RoyceLee  
       2020-06-28 15:20:43 +08:00
    @GM 不正是因为是 stream,所以才会出现粘包吗?
    tctc4869
        4
    tctc4869  
    OP
       2020-06-28 15:25:54 +08:00
    @RoyceLee 我感觉它的评论内容像是杠精,就像国内的一些喷子看见一篇文章的某个段落的几个字就抓住咬着不放一样朝着对方说教,我不知道我开头说的话,哪里刺激到它了。
    dcalsky
        5
    dcalsky  
       2020-06-28 15:26:10 +08:00 via Android
    粘包是通俗说法,就好像 ji 排水专业都读 gei 排水一样,大家懂就行。不然等你牛逼了给它重新命名一个咯。

    不歪楼地说,vertx 比较适合楼主说的,上传下载 websocket 等等都有支持到,也是基于 netty 的。
    GM
        6
    GM  
       2020-06-28 15:37:46 +08:00
    @tctc4869 你用“它”来指代我,就是素质很高?
    tctc4869
        7
    tctc4869  
    OP
       2020-06-28 15:39:55 +08:00
    @dcalsky 在 android 手机里挂起一个用 vert.x 做的通信客户端合适么?
    GM
        8
    GM  
       2020-06-28 15:42:30 +08:00
    @tctc4869
    不想抬杠,只是看到太多“粘包”文章,TCP 特性都不知道就大谈特谈怎么优化解决“粘包问题”,所以一楼评论是我以为又是那种情况,忍不住就这么说了。

    我想了想,确实不太合适,我道歉。不过你那个“它”,希望你也能解释一下。
    tctc4869
        9
    tctc4869  
    OP
       2020-06-28 15:44:44 +08:00
    @GM 我又不知道你到底是男的还是女的,甚至是通过图灵测试的机器人,如果我用他,就让人以为你是男的,如果用她,就让人觉得,你是女的,要么是女装程序员。所以我不知道你的性别,所以我用“它”代替。
    wysnylc
        10
    wysnylc  
       2020-06-28 15:47:43 +08:00
    各位民科请多学点东西
    wysnylc
        11
    wysnylc  
       2020-06-28 15:48:04 +08:00
    图忘了
    sagaxu
        12
    sagaxu  
       2020-06-28 15:50:47 +08:00 via Android
    @GM 搞的清楚流和包的,就不会问这种问题了。
    gotonull
        13
    gotonull  
       2020-06-28 15:51:56 +08:00
    rsocket 了解一下,我们项目有用到
    wysnylc
        14
    wysnylc  
       2020-06-28 15:52:56 +08:00
    可能有人觉得 B 乎或者廖雪峰不靠谱,那就来个 v2 的
    GM
        15
    GM  
       2020-06-28 15:54:01 +08:00
    @tctc4869 我不是很接受这个解释,不过鉴于我冒犯在先,我就不计较了。
    dcalsky
        16
    dcalsky  
       2020-06-28 15:57:40 +08:00 via Android
    @tctc4869 不合适。手机 websocket 通信看我之前帖子,自己写一个很简单。上传下载文件用 okhttp 即可。
    xuanbg
        17
    xuanbg  
       2020-06-28 15:57:42 +08:00
    楼主如果自己用,那随便整一个协议就完了。如果要开放接口,还是乖乖用 http 吧。虽然效率低,但优点是方便。你整个别的什么 gRPC 这种,如果需要专门搞个 client 的话,还真的挺费事。
    cigarzh
        18
    cigarzh  
       2020-06-28 15:59:17 +08:00
    Vert.x
    tctc4869
        19
    tctc4869  
    OP
       2020-06-28 16:02:40 +08:00
    @xuanbg 如果是在手机里,用什么合适。
    xuanbg
        20
    xuanbg  
       2020-06-28 16:04:26 +08:00
    @tctc4869 真想造轮子就自己造呗。如果不是,我劝你还是 http 吧……
    tctc4869
        21
    tctc4869  
    OP
       2020-06-28 16:07:52 +08:00
    @xuanbg 如果一个客户端通过服务器中转与另一个客户端通信呢。
    Aruforce
        22
    Aruforce  
       2020-06-28 16:28:02 +08:00
    netty 好像也有 websocket 相关的 Handler 的吧 比如 WebSocketServerProtocolHandler 这个你看看能不能用?
    qwerthhusn
        23
    qwerthhusn  
       2020-06-28 16:53:55 +08:00
    粘半包这种东西,我理解的“包”,应该就是应用调用一次 read API 获取到的数据。可能因为 MTU 等一些问题导致的这个“包”没能对应上应用层的一次“完整数据”,可能需要把一半数据存下来等后续的“包”直到完成请求。我理解 HTTP 慢攻击的原理就是利用“估计只发前半截,后半截拖着不发”

    不知道为啥有些大佬听到这种词,就感觉很 low ?!
    jworg
        24
    jworg  
       2020-06-28 17:05:24 +08:00
    @qwerthhusn 最开始的争论是“tcp 的粘包”,这个表述确实有些问题,就像 A 的高速公路堵了( tcp 上的自定义协议粘包)与 A 地堵了( tcp 粘包)。不过不加 tcp 限定,单独的“粘包”(堵车),粘包警察就来了确实想不到。
    roundgis
        25
    roundgis  
       2020-06-28 17:06:37 +08:00
    粘半包是什么东西?
    tctc4869
        26
    tctc4869  
    OP
       2020-06-28 17:09:06 +08:00
    @Aruforce 我去看看吧
    est
        27
    est  
       2020-06-28 17:11:44 +08:00
    粘半包是什么东西?甜馅的还是咸的?
    tctc4869
        28
    tctc4869  
    OP
       2020-06-28 17:13:41 +08:00
    @roundgis 发一个数据,发送端把发送数据分层两块,接收端那里变成接收一块,叫粘包,发送一个数据,就整块发送,接收方那里却变成两次接收。叫半包

    而粘半包,就是发送一个较大的数据,同时发生粘和半包现象,即是多个数据块组合到一起,结尾或头部的数据块缺了。头部或尾部发生了半包现象
    biossun
        29
    biossun  
       2020-06-28 17:13:42 +08:00
    挑选适合你的应用场景的应用层协议,然后去找 java 语言的实现模块即可。
    tctc4869
        30
    tctc4869  
    OP
       2020-06-28 17:15:27 +08:00
    @tctc4869 这只是我简单的说明。
    monkeyWie
        31
    monkeyWie  
       2020-06-28 17:31:18 +08:00
    建议把粘半包描述成应用层协议编解码,这样就应该没人杠了吧🐶
    chendy
        32
    chendy  
       2020-06-28 17:31:19 +08:00
    还好楼主说了个粘包,要不然这帖子应该已经沉了
    需要具体场景才能决定用啥,不知道具体场景就 http/ws
    tctc4869
        33
    tctc4869  
    OP
       2020-06-28 17:32:43 +08:00
    @chendy 如果有这种情况,客户端借助服务器中转数据与另一个客户端通信呢,那用什么比较合适,http 通信模型是不行的把。
    ychost
        34
    ychost  
       2020-06-28 17:42:00 +08:00
    简单处理一下,定义一个起始帧,结束帧,和一个 CRC 校验帧,然后数据用 protobuf 进行序列化和反序列化
    yannxia
        35
    yannxia  
       2020-06-28 17:45:53 +08:00
    也就是 HTTP 和 GRPC 选一个咯,觉得 HTTP 不好用,就 GRPC 嘛,自己定数据格式都是在作死的边缘疯狂试探。
    paoqi2048
        36
    paoqi2048  
       2020-06-28 18:09:59 +08:00
    别粘了,别粘了,👩👩怕!
    xingjue
        37
    xingjue  
       2020-06-28 18:12:41 +08:00
    swoole
    vanxy
        38
    vanxy  
       2020-06-28 18:37:35 +08:00
    @qwerthhusn #23 把你提到的名词都 google 一下,花几分钟了解一下。就不会有这些疑问了
    vanxy
        39
    vanxy  
       2020-06-28 18:39:10 +08:00
    @tctc4869 #28 这个现象叫做应用层协议设计有漏洞 or 编解码器设计有问题。

    不要自造词,把锅甩给无辜的 TCP 啦
    labulaka521
        40
    labulaka521  
       2020-06-28 18:44:37 +08:00 via iPhone
    别粘了好吗 粘包👮‍♀️马上就到
    传输控制协议( TCP,Transmission Control Protocol )是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793[1]定义
    tctc4869
        41
    tctc4869  
    OP
       2020-06-28 18:55:48 +08:00
    @vanxy 了解,我初次看 tcp/ip 就是看国内博客的,经常有讲 tcp/ip 粘包现象
    zsdroid
        42
    zsdroid  
       2020-06-29 08:46:40 +08:00
    都 0202 年了,还有人做粘包警察,真是服了,一说粘包就是 tcp 没有包。你见过老婆饼里的老婆吗?雪碧里的雪吗。一个字眼也要揪半天。活着累不累啊
    labulaka521
        43
    labulaka521  
       2020-06-29 09:35:03 +08:00 via iPhone
    @zsdroid 那你知道为什么粘包为什么在英文论坛查不到资料吗
    本来是应用层的问题 结果被国内某些人硬塞到 tcp 里 笑死
    dallaslu
        44
    dallaslu  
       2020-06-29 12:53:34 +08:00
    学到了新词汇:粘半包。

    机场的行李传送带( TCP ),上面的行李大多是完好的,打包到箱子里的,虽然有大有小,但是一目了然( HTTP/FTP ...)。整理员能直接拎起来。

    突然来了一批散装行李(自定应用协议),整理员傻眼了,只好凭感觉把散件捆好,乘客取行李时肯定是要厮打起来:我少了一件内衣,怎么捆在你这里了!(所谓粘包问题)

    问题的原因是乘客存行李时,没有使用标准登机箱,而是选择了整理员难以正确处理的特立独行的方式(未设计好的自定应用协议)。

    乘客 A 到知乎上提问:行李被机场传送带吃了是什么体验?(误解粘包问题与 TCP 有关)

    乘客 B 经过个人奋斗,在历史进程的影响下改变了机场行李的规则,所有乘客携带物品需要散开传送,为避免混乱,每件单独物品均有乘客编号,同时对整理员进行培训考核。这场变革大大提升了安检与托运效率。(设计良好的自定应用协议)

    因为整理员任务繁重,不得不扩大用人规模,成本增加,业绩亏损,不得不重新强制使用标准登机箱。(自定应用协议上线后掉进大坑,只好替换为成熟方案)
    tctc4869
        45
    tctc4869  
    OP
       2020-06-29 13:29:32 +08:00
    @chendy

    成熟方案有哪些?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5997 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:17 · PVG 11:17 · LAX 19:17 · JFK 22:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.