V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  ming159  ›  全部回复第 5 页 / 共 5 页
回复总数  94
1  2  3  4  5  
2021-08-18 15:49:00 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@wengang285 根据实际场景选择吧,例如 数据量相对较大,且 buffer 小的时候,如果不尽快从 buffer 中取出数据, 引发 流量控制机制,反而导致整体传输变慢.
2021-08-18 15:19:36 +08:00
回复了 ming159 创建的主题 程序员 工业数据通信网关程序
多谢,目前是用 Java 基于 Netty 做. 想先做好 稳定性 只采集,也够支持目前数字化车间的应用场景了. 且最低可以稳定在 5ms~10ms 的采集周期也足以应付绝大多数数据采集续期. 稳定性,协议多样性以后,再想办法扣速度. 支持可靠的写入特性.(与 plc 做写入交互,确保确实写入了.)
2021-08-18 15:04:32 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@wengang285
但也可以是 长度( 4 字节)+buffer,缓冲区可读,那么查看先读长度,然后根据长度往后取 buffer,有多少取多少,因为没有取够, 那么下一次再次通知的时候,与上一次的已经取出来的拼接,直到取够 "长度" 为一次完整帧.
2021-08-18 14:44:13 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@deavorwei
TCP 保证了 有序性,完整性. 是指:
发送端 发送了 #1 2 3 4 5$ #a b c d e$ . 接收端最终收到的也是 #1 2 3 4 5$ #a b c d e$ 有序,且完整.
但是

接收过程

接收过程

接收过程

(重要的点) 会是这样的
情况 1: #1 2 3 4 5$ #a b c d e$
情况 2: #1 2 3 和 4 5$ #a b c d e$
顺序没乱,且数据没丢.
2021-08-18 14:30:48 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@darknoll 54 楼 并不是虚构的协议. 可以参考
1. Modbus ASCII 在 ASCII 传输模式下,消息帧以英文冒号”:”( 3A )开始,以回车( 0D )和换行( 0A )结束.
2. 基恩士 PLC 中的 上位链路协议: [功能码] 开始,回车( 0D )结束.
2021-08-18 11:17:59 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@darknoll 不是说所有协议都是这种模式"magic number+数据长度". 自己研究去吧
2021-08-18 11:14:05 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
“TCP 的粘包问题” 确实不严谨.这点我也承认.

"基于 TCP 传输数据,必然存在应用层数据的 粘包 /拆包问题".

如果写过 TCP 通信(Socket 编程)的懂得自然懂,不懂得说多了也没用, 可以参考 Netty 中的
LineBasedFrameDecoder : 基于回车换行符的解码器
DelimiterBasedFrameDecoder: 分隔符解码器,可以指定消息结束的分隔符
FixedLengthFrameDecoder: 固定长度解码器,它能够按照指定的长度对消息进行自动解码
LengthFieldBasedFrameDecoder :一般协议头中带有长度字段,通过使用 LengthFieldBasedFrameDecoder 传入特定的参数,来解决拆包粘包
2021-08-18 11:04:02 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@ckdxc 你说的这是一种,我没记错,应该叫做 "定长协议" ,就是一个数据段固定长度,比如 512 个字节.每次固定取这么长度的就可以.
但是还有"可变长度"的协议,就需要在数据段中某个固定位置上指示 本次数据自身的长度,例如: #3abc,#5abcde.
表示 #开头,随后的数字表示后续数据的长度,比如 3,5,分别表示在此之后还有若干个数据才算一段完整的数据集.

还有另外一种,固定以回车换行符为分隔符的,无论多长,只要有回车换行符就切断
2021-08-18 10:49:37 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
@leonme
@raptor
@allenby
@dcoder
@hahasong
@lasfresas
"Talk is cheap ,Show me the code"
请贴出你们针对 54 楼问题的代码
2021-08-18 10:32:29 +08:00
回复了 zyxk 创建的主题 Go 编程语言 golang 有什么 TCP 框架?
假设有一个数据源,源源不断的产生数据,需要通过 TCP 传输,同时,这些数据是一段一段的;
假设以#开头,以$结束. 比如 #abc123$ 为一段完整数据.
应用层代码接收到数据时,就会出现如下三种情况:
1. 刚好收到完整的数据: #abc123$
2. 分为了 2 次收到完整数据: 第一次: #abc ; 第二次: 123$
3. 1 次收到数据,多于一段完整数据: #abc123$#ab

请问你的代码如何处理以上三种情况?
onData("#abc");
onData("123$");
onData("#edf456$#hj");
onData("k789$");
最后希望得到的是

#abc123$
#edf456$
#hjk789$


private String cache="";

public void onData(String data){
// 请把这里补充完整,就理解了.
}
2021-06-05 11:25:38 +08:00
回复了 balabalaguguji 创建的主题 程序员 为什么要叫钩子?
主要是为了 扩展性 . 比如你设计一个框架可以这样来做

// 可以是接口,也可以是函数,或者是其他
[函数|接口] hook=null;

// 注册钩子函数
function addHook([函数|接口] hook){
this.hook=hook;
}

// 此函数就可以由于钩子函数的存在,在不修改代码的基础上通过传入不同的钩子实现不同的逻辑
function something(Object args){
// 比如首先参数验证,然后做一些处理
if(this.hook!=null){
args = this.hook(args); // 调用钩子函数
}
// 后续的操作
// 如果没有注册钩子函数,则系统就是默认行为.
// 如果之前添加了自定义的钩子函数,可以对系统默认行为作出自定义
}
2021-06-02 11:23:16 +08:00
回复了 ffw5b7 创建的主题 MySQL 求助:sql 优化。
提供两个改造建议:
1. where 后增加条件过滤,且增加的过滤字段,要建立索引,同时避免 "索引失效"的问题
2. 简单的将 detail_site 建立全文索引(数据库支持的前提下)
但是无论如何 del_flag 这个字段是要建立索引的,这是你当前 sql 中唯一的过滤条件.
2021-05-31 16:26:55 +08:00
回复了 vevlins 创建的主题 程序员 lowcode 是不是在断后人的路?
蒸汽机是不是在断纺织工人的饭碗?
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1033 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 23:45 · PVG 07:45 · LAX 16:45 · JFK 19:45
Developed with CodeLauncher
♥ Do have faith in what you're doing.