用基于传输层 tcp 协议的 socket 框架(比如 Netty )要简单的通信,要处理粘半包,如果要考虑传输特殊格式的话剧,那么可以用一用原始的 socket 实现。
如果考虑多文件(上传下载),要考虑更多的情况,要编写的代码就更多。那么有哪些基于应用层协议的通信框架么,比如 WebSocket,包括客户端与服务端。关于 websocket 框架,java 有哪些呢,服务端与客户端?
不一定要与 http 服务端程序挂在一个进程里,可能会单独使用。
1
GM 2020-06-28 15:01:32 +08:00 4
都 0202 年了,还神“粘半包”,tcp 是个流( stream ),搞明白什么叫 stream,再来谈 tcp 通讯。
|
4
tctc4869 OP @RoyceLee 我感觉它的评论内容像是杠精,就像国内的一些喷子看见一篇文章的某个段落的几个字就抓住咬着不放一样朝着对方说教,我不知道我开头说的话,哪里刺激到它了。
|
5
dcalsky 2020-06-28 15:26:10 +08:00 via Android
粘包是通俗说法,就好像 ji 排水专业都读 gei 排水一样,大家懂就行。不然等你牛逼了给它重新命名一个咯。
不歪楼地说,vertx 比较适合楼主说的,上传下载 websocket 等等都有支持到,也是基于 netty 的。 |
8
GM 2020-06-28 15:42:30 +08:00
@tctc4869
不想抬杠,只是看到太多“粘包”文章,TCP 特性都不知道就大谈特谈怎么优化解决“粘包问题”,所以一楼评论是我以为又是那种情况,忍不住就这么说了。 我想了想,确实不太合适,我道歉。不过你那个“它”,希望你也能解释一下。 |
9
tctc4869 OP @GM 我又不知道你到底是男的还是女的,甚至是通过图灵测试的机器人,如果我用他,就让人以为你是男的,如果用她,就让人觉得,你是女的,要么是女装程序员。所以我不知道你的性别,所以我用“它”代替。
|
10
wysnylc 2020-06-28 15:47:43 +08:00
各位民科请多学点东西
|
11
wysnylc 2020-06-28 15:48:04 +08:00
|
13
gotonull 2020-06-28 15:51:56 +08:00
rsocket 了解一下,我们项目有用到
|
14
wysnylc 2020-06-28 15:52:56 +08:00
|
16
dcalsky 2020-06-28 15:57:40 +08:00 via Android
@tctc4869 不合适。手机 websocket 通信看我之前帖子,自己写一个很简单。上传下载文件用 okhttp 即可。
|
17
xuanbg 2020-06-28 15:57:42 +08:00
楼主如果自己用,那随便整一个协议就完了。如果要开放接口,还是乖乖用 http 吧。虽然效率低,但优点是方便。你整个别的什么 gRPC 这种,如果需要专门搞个 client 的话,还真的挺费事。
|
18
cigarzh 2020-06-28 15:59:17 +08:00
Vert.x
|
22
Aruforce 2020-06-28 16:28:02 +08:00
netty 好像也有 websocket 相关的 Handler 的吧 比如 WebSocketServerProtocolHandler 这个你看看能不能用?
|
23
qwerthhusn 2020-06-28 16:53:55 +08:00
粘半包这种东西,我理解的“包”,应该就是应用调用一次 read API 获取到的数据。可能因为 MTU 等一些问题导致的这个“包”没能对应上应用层的一次“完整数据”,可能需要把一半数据存下来等后续的“包”直到完成请求。我理解 HTTP 慢攻击的原理就是利用“估计只发前半截,后半截拖着不发”
不知道为啥有些大佬听到这种词,就感觉很 low ?! |
24
jworg 2020-06-28 17:05:24 +08:00
@qwerthhusn 最开始的争论是“tcp 的粘包”,这个表述确实有些问题,就像 A 的高速公路堵了( tcp 上的自定义协议粘包)与 A 地堵了( tcp 粘包)。不过不加 tcp 限定,单独的“粘包”(堵车),粘包警察就来了确实想不到。
|
25
roundgis 2020-06-28 17:06:37 +08:00
粘半包是什么东西?
|
27
est 2020-06-28 17:11:44 +08:00
粘半包是什么东西?甜馅的还是咸的?
|
28
tctc4869 OP @roundgis 发一个数据,发送端把发送数据分层两块,接收端那里变成接收一块,叫粘包,发送一个数据,就整块发送,接收方那里却变成两次接收。叫半包
而粘半包,就是发送一个较大的数据,同时发生粘和半包现象,即是多个数据块组合到一起,结尾或头部的数据块缺了。头部或尾部发生了半包现象 |
29
biossun 2020-06-28 17:13:42 +08:00
挑选适合你的应用场景的应用层协议,然后去找 java 语言的实现模块即可。
|
31
monkeyWie 2020-06-28 17:31:18 +08:00
建议把粘半包描述成应用层协议编解码,这样就应该没人杠了吧🐶
|
32
chendy 2020-06-28 17:31:19 +08:00
还好楼主说了个粘包,要不然这帖子应该已经沉了
需要具体场景才能决定用啥,不知道具体场景就 http/ws |
33
tctc4869 OP @chendy 如果有这种情况,客户端借助服务器中转数据与另一个客户端通信呢,那用什么比较合适,http 通信模型是不行的把。
|
34
ychost 2020-06-28 17:42:00 +08:00
简单处理一下,定义一个起始帧,结束帧,和一个 CRC 校验帧,然后数据用 protobuf 进行序列化和反序列化
|
35
yannxia 2020-06-28 17:45:53 +08:00
也就是 HTTP 和 GRPC 选一个咯,觉得 HTTP 不好用,就 GRPC 嘛,自己定数据格式都是在作死的边缘疯狂试探。
|
36
paoqi2048 2020-06-28 18:09:59 +08:00
别粘了,别粘了,👩👩怕!
|
37
xingjue 2020-06-28 18:12:41 +08:00
swoole
|
38
vanxy 2020-06-28 18:37:35 +08:00
@qwerthhusn #23 把你提到的名词都 google 一下,花几分钟了解一下。就不会有这些疑问了
|
39
vanxy 2020-06-28 18:39:10 +08:00
|
40
labulaka521 2020-06-28 18:44:37 +08:00 via iPhone
别粘了好吗 粘包👮♀️马上就到
传输控制协议( TCP,Transmission Control Protocol )是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793[1]定义 |
42
zsdroid 2020-06-29 08:46:40 +08:00
都 0202 年了,还有人做粘包警察,真是服了,一说粘包就是 tcp 没有包。你见过老婆饼里的老婆吗?雪碧里的雪吗。一个字眼也要揪半天。活着累不累啊
|
43
labulaka521 2020-06-29 09:35:03 +08:00 via iPhone
@zsdroid 那你知道为什么粘包为什么在英文论坛查不到资料吗
本来是应用层的问题 结果被国内某些人硬塞到 tcp 里 笑死 |
44
dallaslu 2020-06-29 12:53:34 +08:00
学到了新词汇:粘半包。
机场的行李传送带( TCP ),上面的行李大多是完好的,打包到箱子里的,虽然有大有小,但是一目了然( HTTP/FTP ...)。整理员能直接拎起来。 突然来了一批散装行李(自定应用协议),整理员傻眼了,只好凭感觉把散件捆好,乘客取行李时肯定是要厮打起来:我少了一件内衣,怎么捆在你这里了!(所谓粘包问题) 问题的原因是乘客存行李时,没有使用标准登机箱,而是选择了整理员难以正确处理的特立独行的方式(未设计好的自定应用协议)。 乘客 A 到知乎上提问:行李被机场传送带吃了是什么体验?(误解粘包问题与 TCP 有关) 乘客 B 经过个人奋斗,在历史进程的影响下改变了机场行李的规则,所有乘客携带物品需要散开传送,为避免混乱,每件单独物品均有乘客编号,同时对整理员进行培训考核。这场变革大大提升了安检与托运效率。(设计良好的自定应用协议) 因为整理员任务繁重,不得不扩大用人规模,成本增加,业绩亏损,不得不重新强制使用标准登机箱。(自定应用协议上线后掉进大坑,只好替换为成熟方案) |