ClientSocket采用非阻塞方式,ServerSocket采用线程阻赛方式ClientSocket的请求包大小为40字节左右,ServerSocket收到请求以后马上返回包给客户端(大小也是40字节左右)。
包头有规定,收包时会判断包头是否正确再进行处理(计数也是在判断以后进行)出现的问题:
ClientSocket采用多个定时器同时给Server发请求,在Server端收到的请求包跟客户端统计的一致,也返回如此请求数量的包,但在Client端接收到的返回包却少了,请求量越大,丢的包越多。请问:
是客户端接收来不及,还是服务端并没有真正发过来或者是发的是错误的包呢?
客户端改为阻赛方式是否好一些呢?(呵呵,客户端的阻赛方式怎么写呢?)

解决方案 »

  1.   

    为什么不做一个路由器呢,多开几个Server,让路由去帮你负载均衡。
      

  2.   

    阻不阻塞先不管,我想事实上TCLIENTSOCKET提供的数据流并没有丢你的数据块.
    它只是提供的数据流服务,就是说,发送方多次SEDN操作并不意味着接收方同样多次ONREAD.
    非阻塞方式中,一次ONREAD事件,可能是把多个你SERVER端的数据包作为一整个数据流读出.至于阻塞方式,DELPHI帮助里面有.
      

  3.   

    这是Winsock的angle发送机制,你若看过Dxsock早期的源码就会知道,在使用overload api的情况下,winsock会填充你的缓冲区直到满了才一次性发送。Tserversocket正是用的这样的机制
      

  4.   

    呵呵,谢谢各位老大。正如halfdream(哈欠) 、eatalots(大吃一碗)所说,我是在OnRead中有判断接收到的是否多个包。现在问题出在,我连续发送800个请求(请求包40字节左右)左右,当我收到500个左右返回包后,客户端程序马上停滞了,过了10来秒,才恢复过来,但此时已经收不到包了,但是服务器还是照样可以收到我的请求包,并且有返回包给我的。ps:一个包(在OnRead的ReceiveBuf时)最大会有多大呢,在OnRead中,定义接收buffer为多大比较合适呢?
      

  5.   

    补充一下我的疑问:
      我定义的接收缓冲区的大小是否对我收包时候有影响,有什么样的影响呢?
      我在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;
          
      

  6.   

    细细一想,这样接包也不是个解决办法,倘若发过来的包本身不完整,包头在第一个OnRead事件中,数据在第二个OnRead事件中,这时候要接就麻烦了。
      

  7.   

    呵呵..有些东西本来是有些麻烦,,有时候要把多次ONREAD读出来的数据接起来,
    但看你的情况,是基本上不会的.
      

  8.   

    ONREAD里面,ReceiveBuf所使用的缓冲大小关系并不大,很多时候需要多次ReceiveBuf在一次
    ONREAD事件里.
      

  9.   

    呵呵,问题已经解决。多谢halfdream(哈欠) ,问题是我的一个疏忽造成(一个全局数组越界),不过原来确实对阻赛和非阻赛有些模糊,所以问题一出现就产生很多疑问了;-(