TServerSocket发送的Char长度与TClientSocket收到的Char长度不相等,可能是什么原因? 我的服务器采用ServerSocket.SendBuf(Buf,len1)发送,而客户端采用len2:=ClientSocket.ReceiveBuf(Buf,65536)为什么在发送和接收中len1与len2不相等? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么要相等呢?TCP协议本来就只是提供可靠的数据流服务。仅仅数据流,它这一层不提供同步。 有可能是網絡速度的原因, 分成兩次或多次到達Client端吧! 请问halfdream:要怎么解决同步的问题呢? TCP以上常用的通讯协议,实现同步一般两种..1,特定字符作为分隔..最明显的例子就是http使用两个回车换行..DELPHI带的indy控件组就提供了readln之类方法,可以用指定字符作为同步,非常方便.可惜TServerSocket并没有直接接供,需要自己编码才行.2,发送数据块方式.在数据块里面特定字段给出数据块的长度信息,以确定数据块的完整性.DELPHI的Scktsvr.exe,TSocketConnection就是这样.. 是这样的,不保证客户端一次性全部收到,所以你要在Client里判断,组合起来。 这么说,发送一段数据,接收端就有可能触发多次的Read事件? len2:=ClientSocket.ReceiveBuf(Buf,65536)中Len2最大为8192吧你可以多次调用ClientSocket.ReceiveBuf 如果Buf定义的是PChar类型,那么你的代码可能写错了。发送端:ServerSocket.SendBuf(Buf^, len1);接收端:len2:=ClientSocket.ReceiveBuf(Buf^, len);当然,如果是流式的还要自己拼凑数据。 不会分多次的只是你的协议定义和代码有问题TCP/IP保证数据传输的顺序和完整性,你的数据加不加分割符号是你自己的数据的问题但是在网络上传输的时候TCP/IP协议会自动给你加上通讯层的包头包尾,你的数据可能是一笔一笔到缓冲区发过去的,但是在对方的端点肯定是接收完才有操作系统通知进程数据完毕,触发事件处理,或者你主动读写的时候比如用waitfordata都是要等数据完全准备好才会返回true 如何在SQL中建立字段链接到实际硬盘文件 关于打包后的数据库路径问题。 问个简单问题,如何在DLL中使用ADO控件 如何在用SQL语句插入数据时,使用params[..].as 将空值插进去? 怎样在程序中调试Dll 关于Tchart使用的问题,请大家帮忙!(在线) 如何把 图片(主要bmp,jpg)存到数据库里面!!!---在线等待,100分相送 请教各位,您每天要在电脑前做多少时间? 做视频的请帮忙 请问一个DLL的简单问题 两个初级问题,如何加载activeX和dll控件 关于dbf数据库字段问题,在线等待!
TCP协议本来就只是提供可靠的数据流服务。仅仅数据流,它这一层不提供同步。
1,特定字符作为分隔..
最明显的例子就是http使用两个回车换行..
DELPHI带的indy控件组就提供了readln之类方法,可以用指定字符作为同步,非常方便.
可惜TServerSocket并没有直接接供,需要自己编码才行.2,发送数据块方式.
在数据块里面特定字段给出数据块的长度信息,以确定数据块的完整性.
DELPHI的Scktsvr.exe,TSocketConnection就是这样..
你可以多次调用ClientSocket.ReceiveBuf
ServerSocket.SendBuf(Buf^, len1);
接收端:
len2:=ClientSocket.ReceiveBuf(Buf^, len);当然,如果是流式的还要自己拼凑数据。
只是你的协议定义和代码有问题
TCP/IP保证数据传输的顺序和完整性,你的数据加不加分割符号是你自己的数据的问题
但是在网络上传输的时候TCP/IP协议会自动给你加上通讯层的包头包尾,你的数据可能是一笔一笔到缓冲区发过去的,但是在对方的端点肯定是接收完才有操作系统通知进程
数据完毕,触发事件处理,或者你主动读写的时候比如用waitfordata都是要等数据完全准备好才会返回true