ClientSocket采用非阻塞方式,ServerSocket采用线程阻赛方式ClientSocket的请求包大小为40字节左右,ServerSocket收到请求以后马上返回包给客户端(大小也是40字节左右)。
包头有规定,收包时会判断包头是否正确再进行处理(计数也是在判断以后进行)出现的问题:
ClientSocket采用多个定时器同时给Server发请求,在Server端收到的请求包跟客户端统计的一致,也返回如此请求数量的包,但在Client端接收到的返回包却少了,请求量越大,丢的包越多。请问:
是客户端接收来不及,还是服务端并没有真正发过来或者是发的是错误的包呢?
客户端改为阻赛方式是否好一些呢?(呵呵,客户端的阻赛方式怎么写呢?)
包头有规定,收包时会判断包头是否正确再进行处理(计数也是在判断以后进行)出现的问题:
ClientSocket采用多个定时器同时给Server发请求,在Server端收到的请求包跟客户端统计的一致,也返回如此请求数量的包,但在Client端接收到的返回包却少了,请求量越大,丢的包越多。请问:
是客户端接收来不及,还是服务端并没有真正发过来或者是发的是错误的包呢?
客户端改为阻赛方式是否好一些呢?(呵呵,客户端的阻赛方式怎么写呢?)
它只是提供的数据流服务,就是说,发送方多次SEDN操作并不意味着接收方同样多次ONREAD.
非阻塞方式中,一次ONREAD事件,可能是把多个你SERVER端的数据包作为一整个数据流读出.至于阻塞方式,DELPHI帮助里面有.
我定义的接收缓冲区的大小是否对我收包时候有影响,有什么样的影响呢?
我在OnRead中有如下代码:
RecNum := Socket.ReceiveLength;
RecNum := Socket.ReceiveBuf(buffer1, RecNum);
... 但当buffer1的小于RecNum时怎么办呢,也就是说我定义的缓冲区的控件小于实际一次发过来的包时该怎么办--应当会有异常吧。
另外假设发过来的包有10K,而我接收缓冲区只有8K大小,那我接收这8k以后,剩下的2K怎么办呢,它会再次触发OnRead来让我取,还是需要我取两次,把数据接起来呢 根据我现在的理解,我想改为下面这样,不知道有什么问题没有,请各位指点指点:
RealLen := sizeof(buffer1);
RecNum := Socket.ReceiveLength;
if RecNum < sizeof(buffer1) then
RecNum := Socket.ReceiveBuf(buffer1, RecNum)
else
while(RealLen=sizeof(buffer1)) and (RealLen<>-1) do
begin
RealLen := Socket.ReceiveBuf(buffer1, sizeof(buffer1))
....
end;
但看你的情况,是基本上不会的.
ONREAD事件里.