易语言写通讯软件,遇到粘包麻烦,希望高手相助!
用的是 服务器 和 客户 这两个组件,当服务器的发送命令连续两条时,客户那边就会有粘包现象。。
比如:
服务器1.发送数据(IP,“01234”, )
服务器1.发送数据(IP,“56789”, )
客户端收到的数据就是 “012345678”,该如何解决?
应答的方法严重影响服务器的执行效率(要处理大量的数据),所以不用考虑。
不好意思。。客户端收到的数据是 “0123456789”,打错了。。
如果能帮我解决这个问题大大加分哦。。 展开
在开发程序的时候 使用易语言的 服务端 与 客户端 控件时 ,一般不直接使用发送数据功能。
因为网络存在丢包的可能,所以易语言的服务端会自动的重发刚刚丢失的包,直到完全结束。
有很多新手朋友在使用易语言传送文件的老出现这个问题。
估计你的这个问题也是一样的原因照成的,丢包!
最简单有效的解决办法:
封装一个发包的方法,我这里已服务端给客户端发送消息举例,到时候你还需要同样在客户端上写相同的代码。
-------------------------------------------
.版本 2
.程序集 窗口程序集1
.程序集变量 temp数据包尾部, 文本型
.子程序 __启动窗口_创建完毕
temp数据包尾部 = “{【结尾】[over]}”
.子程序 封装的发送方法
.参数 客户IP, 文本型
.参数 data, 字节集
服务器1.发送数据 (客户IP, data + 到字节集 (temp数据包尾部), )
.子程序 _服务器1_数据到达
接收到的数据进行处理 (服务器1.取回数据 ())
.子程序 接收到的数据进行处理
.参数 data, 字节集
.局部变量 oldData, 字节集, 静态, , 注意,这是一个静态的变量,如果理解不到静态的意思就请使用全局变量
oldData = oldData + oldData
' 判断如果 该数据包的尾部不等于
.如果 (取字节集右边 (oldData, 取字节集长度 (oldData) - 取文本长度 (temp数据包尾部)) ≠ 到字节集 (temp数据包尾部))
' 如果说不相同就说明 数据还没有完全的过来,所以这里不做任何处理
.否则
处理完整传递的数据 (oldData) ' 如果相等了,就说明数据已经完全的过来了,我们就调用数据传递后的方法
oldData = { } ' 这里记住,调用完毕后就必须置空字节集
.如果结束
.子程序 处理完整传递的数据
.参数 data, 字节集
' 在这里就可以写你的处理方法了,
' by : 炫e小锋 QQ:251708339